I check program for many input values, for max integer it works fine, but it didn't output the last 7 numbers for max long
package com.codegym.task.task20.task2025;
import java.util.Arrays;
import java.util.TreeSet;
/*
Number algorithms
*/
public class Solution {
static TreeSet<Long> set = new TreeSet<>();
public static long[] getNumbers(long N) {
if(N < 0)return new long[0];
long[] result;
int maxCount = (int)Math.log10(N) + 1;
if(N == 0) maxCount = 1;
long[][] pow = new long[10][maxCount + 2];
for (int i = 0; i < 10; i++) {
for (int j = 0; j <= maxCount + 1; j++) {
pow[i][j] = (long) Math.pow(i, j);
}
}
generateNumber(pow, N, maxCount, 0L, 9);
result = new long[set.size()];
int i = 0;
for (long s : set) {
result[i] = s;
i++;
}
return result;
}
private static void generateNumber(long[][] pow, long N, int maxCount, long first, int last) {
long sumPow = 0;
for (int i = 0; i <= last; i++) {
if (i != 0)
first++;
if (first > 0) {
sumPow = sum(pow, first);
if (sumPow >= first / 10 && sumPow < N) {
if (isArmstrong(first, sumPow))
set.add(sumPow);
generateNumber(pow, N, maxCount, first * 10, i);
}
}
}
}
private static long sum(long[][] pow, long n) {
//System.out.println(n);
int count = (int)Math.log10(n) + 1;
long sum = 0;
while (n > 0) {
sum += pow[(int)(n % 10)][count];
n /= 10;
}
return sum;
}
private static boolean isArmstrong(long n, long s) {
int nLength;
int sLength;
if (n == 0)
return false;
nLength = 1 + (int)Math.log10(n);
sLength = 1 + (int)Math.log10(s);
if (nLength != sLength)
return false;
int[] num = new int[nLength];
int[] sum = new int[nLength];
int i = 0;
while (i < nLength) {
num[i] = (int)(n % 10);
n /= 10;
sum[i] = (int)(s % 10);
s /= 10;
i++;
}
Arrays.sort(num);
Arrays.sort(sum);
return Arrays.equals(num, sum);
}
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)));
//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);
}
}