Приветствую и прошу помощи:
1) Я уже понял, что надо как-то заменить тупой перебор в цикле for на нечто более умное. Подскажите плиз развернуто, как это сделать.
2) Валидатор ругается не на время выполнения, а на возникающие исключения в методе getNumbers. Куда копать?
package com.javarush.task.task20.task2025;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
/*
Алгоритмы-числа
*/
public class Solution {
private static long[][] matrix = new long[10][21];
static {
for (int i = 1; i < 10; i++)
for (int j = 1; j < 21; j++)
matrix[i][j] = (long) Math.pow((double) i, (double) j);
}
public static long[] getNumbers(long N) {
ArrayList<Long> list = new ArrayList<>();
long counter = 1;
while (counter < N) {
if (isIncreasing(counter)) {
long sum = squaresSum(counter);
if (isArm(sum) && !list.contains(sum) && sum < N) list.add(sum);
counter = findNextInc(counter);
}
}
Collections.sort(list);
long[] result = new long[list.size()];
for (int i = 0; i < result.length; i++) {
result[i] = list.get(i);
}
return result;
}
private static boolean isIncreasing(long num) {
int prev = 0;
while (num > 0) {
int digit = (int) (num % 10);
if ((digit > prev || digit == 0) && prev != 0) {
return false;
}
num /= 10;
prev = digit;
}
return true;
}
private static boolean isArm(long num) {
return squaresSum(num) == num;
}
private static long squaresSum(long num) {
int len = (int) Math.log10(num) + 1;
long sum = 0;
while (num > 0) {
sum += matrix[(int) (num % 10)][len];
num /= 10;
}
return sum;
}
private static long findNextInc(long num) {
if (num == 0) return 1;
int zeros = 0;
while (num % 10 == 0) {
zeros++;
num /= 10;
}
int rem = (int) num % 10;
if (zeros == 0) return ++num;
return num * (long) Math.pow(10, zeros) + rem * (long) Math.pow(10, zeros - 1);
}
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
long[] res = getNumbers(10_000_000_000L);
System.out.println(Arrays.toString(res));
long timeSpent = System.currentTimeMillis() - startTime;
System.out.println("программа выполнялась " + timeSpent + " миллисекунд");
System.out.println("memory: " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1000000 + " MB");
}
}