Для основных комбинаций входящих параметров возвращается корректное количество найденных цифр, но почему-то валидатор выдает ошибку:
В массиве возвращаемом методом getNumbers не хватает элементов или есть лишние.
Помогите, пожалуйста!
package com.javarush.task.task20.task2025;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
public class Solution {
private static Set<Long> replica = new TreeSet<>();
private static long[][] pows = new long[10][21];
private static long T;
public static void main(String[]args) {
long start = System.currentTimeMillis();
long[] array = getNumbers(Long.MAX_VALUE);
long end = System.currentTimeMillis() - start;
long memore = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
SimpleDateFormat sdf = new SimpleDateFormat("ss.SSS");
System.out.println("Time = " + sdf.format(new Date(end)));
System.out.println("Memory = " + memore / 1048576);
Set<Long> armstrongNumbers = new TreeSet<>(Arrays.stream(array).boxed().collect(Collectors.toSet()));
for (long a : armstrongNumbers) {
if (a != 0)
System.out.print(a + " ");
}
}
public static void generate(int first, long number, int rank)
{
for(int i = first; i < 10; i++){
long result = number + i * ((long)(Math.pow(10, rank -1)));
if (result < 0) return;
long sumOfPowers = sum(result);
if (isArmstrongNumber(sumOfPowers)) {
replica.add(sumOfPowers);
}
if(rank > 1) generate(i, result, rank -1);
}
}
public static long[] getNumbers(long N) {
T = N;
if(N <= 0) return null;
else if(N <10){
long[] result = new long[(int)N];
for(int i =1; i < N; i++)result[i-1] = i;
return result;
}
long s = (""+(N)).length();
//Заполняем массив степеней
for(int k = 0; k < 10; k++) {
for (int m = 0; m <= 20; m++){
if(m <= 1)pows[k][m] = (long) Math.pow(k, m);
else pows[k][m] = k * pows[k][m-1];
}
}
//Рекурсивно перебираем все подходящие цифры
for(int i = 1; i <= s; i++) generate(1, 0, i);
//Готовим ответ
long[] result = new long[replica.size()];
int i=0;
for(Long l : replica)
{
result[i++] = l;
}
return result;
}
private static boolean isArmstrongNumber(long number) {
return ((sum(number) == number && number < T) ? true:false);
}
public static long sum(long a) {
long addition = 0;
int d = ("" + a).length();
int b = (int)(a % 10);
while (a >= 1) {
addition += pows[b][d];
a /= 10;
b = (int)(a % 10);
}
return addition;
}
}