Валидатор выдает ошибку "В массиве возвращаемом методом getNumbers не хватает элементов или есть лишние." вот только ничего лишнего там нет, а все что должно быть - присутствует. Помогите пожалуйста, уже неделю сижу, с ума схожу :)
package com.javarush.task.task20.task2025;
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.CountDownLatch;
/*
Алгоритмы-числа
*/
public class Solution {
public static volatile Set<Long> set = new TreeSet<>();
public static volatile Integer quantity;
public static volatile Long figure;
public static volatile long[][] matrix = matrix();
public static class Counter extends Thread {
CountDownLatch cdl;
int quantity;
public Counter(CountDownLatch cdl, int quantity) {
this.cdl = cdl;
this.quantity = quantity;
}
public void run() {
generator(quantity, matrix);
cdl.countDown();
}
}
public static long[] getNumbers(long N) throws InterruptedException {
figure = N;
quantity = countDigits(N);
set.add(0L);
CountDownLatch cdl = new CountDownLatch(quantity);
for (int i = 1; i <= quantity; i++) {
new Counter(cdl, i).start();
}
cdl.await();
long[] result = new long[set.size()];
Object[] result2 = set.toArray();
for (int i = 0; i < set.size(); i++) {
result[i] = (long) result2[i];
}
for (int i = 0; i < set.size(); i++) {
System.out.println(result[i]);
}
set.clear();
figure = null;
quantity = null;
return result;
}
public static void isArmstrong (int quantity, long l, long[][] matrix) {
long given = l;
long powSum = 0;
long powSum2 = 0;
while (given > 0) {
if (powSum >= Long.MAX_VALUE) {
break;
} else {
powSum += matrix[(int) (given % 10)][quantity];
}
given /= 10;
}
given = powSum;
while (given > 0) {
if (powSum2 >= Long.MAX_VALUE) {
break;
} else {
powSum2 += matrix[(int) (given % 10)][countDigits(powSum)];
}
given /= 10;
}
if (powSum == powSum2) {
set.add(powSum);
}
}
public static int countDigits(long l) {
int count = 0;
do {
l = l / 10;
count++;
} while (l > 0);
return count;
}
public static long[][] matrix() {
long[][] result = new long[11][20];
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 20; j++) {
result[i][j] = (long) Math.pow(i, j);
}
}
result[9][19] = 1350851717672992089L;
result[7][19] = 11398895185373143L;
result[9][17] = 16677181699666569L;
// result[7][17] = 232630513987207L;
// for (int i = 0; i < 11; i++) {
// for (int j = 0; j < 20; j++) {
// System.out.println(result[i][j]);
// }
// }
return result;
}
public static void generator(int input, long[][] matrix) {
int power = input - 1;
long border = 0;
if (input == 19) {
border = 2223334556777788900L;
} else if (input == quantity) {
border = figure;
} else if (input < quantity) {
border = matrix[10][input];
}
long result = matrix[10][power];
while (result < border) {
if (input == 1) {
isArmstrong(input, result, matrix);
result++;
}
long temp = result;
for (int i = 0; i < power; i++) {
long digit = temp / matrix[10][power - i];
long digit2 = (temp % matrix[10][power - i]) / matrix[10][power - i - 1];
if (digit > digit2) {
if (i != power - 1) {
isArmstrong(input, result, matrix);
result = result + digit * matrix[10][power - i - 1];
break;
} else {
isArmstrong(input, result, matrix);
result = result + digit;
break;
}
} else if (digit == digit2) {
if (i != power - 1) {
temp = temp % matrix[10][power - i];
} else {
isArmstrong(input, result, matrix);
result = result + 1;
break;
}
} else {
if (i != power - 1) {
temp = temp % matrix[10][power - i];
} else {
isArmstrong(input, result, matrix);
result = result + 1;
break;
}
}
}
}
}
public static void main(String[] args) throws InterruptedException {
// long startTime = System.currentTimeMillis();
////
////// for (Long l : set) {
////// System.out.println(l);
////// }
////
// getNumbers(Long.MAX_VALUE);
////
// long timeSpent = System.currentTimeMillis();
// System.out.println((timeSpent - startTime) + " ms");
// long usedBytes = Runtime.getRuntime().totalMemory() / 1048576;
// System.out.println(usedBytes + " mb");
}
}