Здравствуйте! Подскажите в каком направлении искать ошибку? На тестовых данных ответ совпадает с массивом чисел Армстронга с Вики.
package com.javarush.task.task20.task2025;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/*
Алгоритмы-числа
*/
public class Solution {
public static long[] getNumbers(long N) {
//1. Определенеие переменных
int rank = (String.valueOf(N).length());//Разрядность входного числа
int[] mass = new int[rank];//Массив в котором будем "собирать" числа
List<Long> numbers = new ArrayList<>(); //Лист в котором будем хранить найденные числа Амстронга
--rank;
//2. Начальное заполнение
//2.1 Забиваем массив для "сборки" чисел нулями
mass = Arrays.stream(mass).map(a -> a = 0).toArray();
//3. Начинаем перебор чисел
long K = 0l;//Число с которым работаем в текущий момент
while (K < N) {
int rankValue = mass[rank];//Получаем значние младщего разряда
rankValue++;
//3.1 Если это 10 то инкрементируем старший разряд
if (rankValue == 10) {
//Инкрементируем страший разряд
incSeniorRank(mass, rank);
//Получаем новое значение для текущего разряда
if (rank > 0) {
mass[rank] = Math.max(mass[rank - 1], 0);
} else {
mass[rank] = 0;//по идеи такой ситуации быть не должно
System.out.println("Такого быть не должно");
}
} else {
mass[rank] = ++mass[rank];
}
//3.2 Мы инкрементированли число, получим теперь его сумму степеней и проверим есть ли среди них число амстронга
//3.2.1 Получаем числовое значение для определения минимальной разрядности
K = 0;
for (int i = 0; i < mass.length; i++) {
K = K + (long) mass[i] * (int) Math.pow(10, mass.length - 1 - i);
}
int rankMin = ("" + K).length();
int rankMax = ("" + N).length();
//System.out.println(K);
//3.3 Счтаем степени числа...
for (int i = rankMin; i <= rankMax; i++) {
long Amstr1 = 0;
long Amstr2 = 0;
//3.3.1 Исходное число перобразуем в строку для подсчета его суммы квадратов
String[] str = ("" + K).split("");
for (String s : str) {
Amstr1 = Amstr1 + (int) Math.pow(Integer.parseInt(s), i);
}
//3.3.2 Теперь проверяем является ли полученое число числом Амстронга
String[] strAmstr1 = ("" +Amstr1).split("");
for (String s : strAmstr1) {
Amstr2 = Amstr2 + (int) Math.pow(Integer.parseInt(s), (""+Amstr1).length());
}
if (Amstr1 == Amstr2 && !numbers.contains(Amstr1)&&Amstr1<N)
numbers.add(Amstr1);
}
}
//4. Перевод списка в массив
numbers.sort((a,b)-> (int) (a-b));
long[] a = new long[numbers.size()];
for (int i = 0; i < numbers.size(); i++) {
a[i] = numbers.get(i);
}
return a;
}
private static void incSeniorRank(int[] mass, int rank) {
//Если вышли за область разряда то не делаем ничего
if (rank < 0) return;
//Получаем текущее значение
int rankValue = mass[rank];
rankValue++;
//Если это 9 то инкрементируем старший разряд
if (rankValue == 10) {
//Инкрементируем страший разряд
incSeniorRank(mass, rank - 1);
//Получаем новое значение для текущего разряда
if (rank > 0) {
mass[rank] = Math.max(mass[rank - 1], 0);
} else {
mass[rank] = 0;//по идеи такой ситуации быть не должно
System.out.println("Такого быть не должно 1");
}
} else {
mass[rank] = ++mass[rank];
}
}
public static void main(String[] args) {
long a = System.currentTimeMillis();
System.out.println(Arrays.toString(getNumbers(100)));
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(1_000_000)));
b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a) / 1000);
}
}