Мучаюсь месяц, не хочу использовать массив готовых чисел, подскажите пожалуйста что исправить или как ускорить)
package com.javarush.task.task20.task2025;
import java.util.*;
/*
Алгоритмы-числа
*/
public class Solution {
private static long[][] pows;
public static long[] getNumbers(long N) {
if (N <= 1) return new long[0];
ArrayList<Long> armstrongList = new ArrayList<>(arrayNums(N));
long[] armstrong = new long[armstrongList.size()];
for (int i = 0; i < armstrong.length; i++){
armstrong[i] = armstrongList.get(i);
}
return armstrong;
}
public static void genPows (int i){
if (i > 20) throw new IllegalArgumentException();
pows = new long[10][i + 1];
for (int j = 0; j < pows.length; j ++){
int p = 1;
for (int z = 0; z < pows[j].length; z++){
pows[j][z] = p;
p *= j;
}
}
}
public static ArrayList<Long> nums(long i){
long z = i;
ArrayList<Long> list = new ArrayList<>();
while (z > 0){
long j = z % 10;
list.add(j);
z /= 10;
}
Collections.reverse(list);
return list;
}
public static TreeSet<Long> arrayNums(long S){
genPows(String.valueOf(S).length() + 1);
TreeSet<Long> list = new TreeSet<>();
long[] longs = new long[String.valueOf(S).length()];
Arrays.fill(longs, 9);
do {
long sumX1;
long sum1 = 0;
for (Long a : longs) {
sum1 += pow(a, longs.length);
}
long sum2 = 0;
for (Long x : nums(sum1)) {
sum2 += pow(x, nums(sum1).size());
}
if (sum1 == sum2) {
if (sum1 < S) {
list.add(sum1);
}
}
if (longs[0] == 0) {
int L = longs.length - 1;
for (int i = 0; i < longs.length; i++, L--) {
if (longs[i] == 0) {
sumX1 = 0;
for (Long a : longs) {
sumX1 += pow(a, L);
}
int sumX2 = 0;
for (Long x : nums(sumX1)) {
sumX2 += pow(x, nums(sumX1).size());
}
if (sumX1 == sumX2) {
if (sumX1 < S) {
list.add(sumX1);
}
}
} else {
break;
}
}
}
iterationArr(longs);
} while (longs[longs.length - 1] != 0);
return list;
}
public static void iterationArr(long[] i){
int j = 0;
while (true){
if(i[j] > 0){
i[j]--;
if (j > 0){
for (int y = 0; y < j; y++){
i[y] = i[j];
}
}
break;
}
else {
j++;
}
}
}
public static long pow(long i, int pow){
return pows[(int) i][pow];
}
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(1000000000)));
b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a) / 1000);
}
}