Вот вывод соответствующий приложенному коду:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407]
memory 333
time = 0
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834]
memory 3436
time = 1
package com.javarush.task.task20.task2025;
import java.util.*;
/*
Алгоритмы-числа
*/
public class Solution {
static long[][] pow;
static {
pow = new long[][] {
{0L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L},
{0L, 1L, 4L, 9L, 16L, 25L, 36L, 49L, 64L, 81L},
{0L, 1L, 8L, 27L, 64L, 125L, 216L, 343L, 512L, 729L},
{0L, 1L, 16L, 81L, 256L, 625L, 1296L, 2401L, 4096L, 6561L},
{0L, 1L, 32L, 243L, 1024L, 3125L, 7776L, 16807L, 32768L, 59049L},
{0L, 1L, 64L, 729L, 4096L, 15625L, 46656L, 117649L, 262144L, 531441L},
{0L, 1L, 128L, 2187L, 16384L, 78125L, 279936L, 823543L, 2097152L, 4782969L},
{0L, 1L, 256L, 6561L, 65536L, 1953125L, 1679616L, 5764801L, 16777216L, 43046721L},
{0L, 1L, 512L, 19683L, 262144L, 9765625L, 10077696L, 40353607L, 134217728L, 387420489L}
};
}
public static long[] getNumbers(long N) {
ArrayList<Long> longs = new ArrayList<>();
for (int i = 0; i < N; i++) {
long res = 0L;
String number = String.valueOf(i);
for (String integer : number.split("")) {
if (res > i) break;
int temp = Integer.parseInt(integer);
if (temp != 0)
res += pow[number.length()-1][temp];
}
if (res == i) {
longs.add(res);
}
}
final long[] result = new long[longs.size()];
int ind = 0;
for (Long aLong : longs) {
result[ind++] = aLong;
}
return result;
}
public static void main(String[] args) {
long a = System.currentTimeMillis();
System.out.println(Arrays.toString(getNumbers(1000)));
long b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a) / 1000);
a = System.currentTimeMillis();
System.out.println(Arrays.toString(getNumbers(1000000)));
b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a) / 1000);
}
}