Времени уходит очень много, как решать?. Сделал таблицу степеней
package com.javarush.task.task20.task2025;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/*
Алгоритмы-числа
*/
public class Solution {
private static long[][] pows; // массив степеней
private static void genPows(int N) { // генерируем таблицу степеней
if (N > 19) throw new IllegalArgumentException();
N += 1;
pows = new long[10][N];
for (int i = 0; i < 10; i++) {
for (int j = 1; j < pows[i].length; j++) {
pows[i][j] = (long) Math.pow(i, j);
}
System.out.println(Arrays.toString(pows[i]));
}
}
private static long search(int a, int p) { //ищем ззначение в таблице степеней
if (a > 9 || p > 19) throw new IllegalArgumentException();
return pows[a][p];
}
public static long[] getNumbers(long N) {
List<Long> list = new ArrayList<>();
int massiveSize = 0;
genPows(String.valueOf(N - 1).split("").length);
for (long i = 0; i < N; i++) {
String[] f = String.valueOf(i).split("");
long summ = 0;
int length = f.length;
for (String c : f) {
int a = Integer.parseInt(c);
summ += search(a, length);
}
if (summ == i) {
list.add(i);
massiveSize++;
}
}
long[] result = new long[massiveSize];
for (int i = 0; i < list.size(); i++) {
result[i] = list.get(i);
}
return result;
}
public static void main(String[] args) {
Long d = System.currentTimeMillis();
System.out.println(Arrays.toString(getNumbers(10000000)));
Long f = System.currentTimeMillis();
System.out.println(f - d);
}
}