Скорее всего, памяти не хватает. Не знаю что нужно изменить для решения этой проблемы
Вывод в IDE для Long.MAX_VALUE
[1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834, 1741725, 4210818, 9800817, 9926315, 24678050, 24678051, 88593477, 146511208, 472335975, 534494836, 912985153, 4679307774, 32164049650, 32164049651, 40028394225, 42678290603, 44708635679, 49388550606, 82693916578, 94204591914, 28116440335967, 4338281769391370, 4338281769391371, 21897142587612075, 35641594208964132, 35875699062250035, 1517841543307505039, 3289582984443187032, 4498128791164624869, 4929273885928088826]
memory 16707
time = 1
package com.javarush.task.task20.task2025;
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;
public class Solution {
public static long[] getNumbers(long N) {
if (N <= 0)
return null;
long[][] data = getData();
int[] num = new int[String.valueOf(N).length()];
Arrays.fill(num, 9);
Set<Long> narciss = new TreeSet<Long>();
isNarcisstic(num, data, narciss, N);
while (num[num.length - 1] != 0) {
if (!isZero(0, num)) {
num[0]--;
isNarcisstic(num, data, narciss, N);
} else {
isNarcisstic(num, data, narciss, N);
}
}
long[] result = new long[narciss.size()];
int i = 0;
for (Long long1 : narciss) {
result[i++] = long1;
}
return result;
}
static void isNarcisstic(int[] arr, long[][] data, Set<Long> result, long max) {
if(arr[arr.length -1] == 0) return;
long expo1 = 0;
for (int i : arr) {
expo1 += data[i][arr.length];
}
long expo1Copy = expo1;
int expo1Length = String.valueOf(expo1).length();
long expo2 = 0;
while (expo1Copy > 0) {
int figure = (int) (expo1Copy % 10);
expo2 += data[figure][expo1Length];
expo1Copy = expo1Copy / 10;
}
if (expo1 == expo2 && expo1 < max ) {
result.add(expo1);
} else if (arr[0] == 0) {
int[] newArr = new int[arr.length - 1];
for (int i = 1; i < arr.length; i++) {
newArr[i - 1] = arr[i];
}
isNarcisstic(newArr, data, result, max);
}
}
static boolean isZero(int index, int[] arr) {
if (arr[index] == 0) {
if (isZero(index + 1, arr))
return true;
arr[index + 1]--;
for (int i = 0; i <= index; i++) {
arr[i] = arr[index + 1];
}
return true;
}
return false;
}
static long myPow(int num, int power) {
if (num == 0 && num == 1 && power == 0 && power == 1)
return num;
long result = num;
for (int i = 0; i < power - 1; i++) {
result = result * num;
}
return result;
}
static long[][] getData() {
long[][] result = new long[10][20];
for (int i = 0; i <= 9; i++) {
for (int j = 0; j <= 19; j++) {
result[i][j] = (long) myPow(i, j);
}
}
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(Long.MAX_VALUE)));
b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a) / 1000);
}
}