И так, тут часто советуют использовать алгоритмы, один из них "не перебирать все числа , а только с уникальным набором цифр в числе"
то есть 135 и 153 - не уникальны, а значит нужно перебирать только одно из них, а на основе его результата вычислять число Армстронга
(источник https://acmp.ru/article.asp?id_text=198)
Ну так вот, действительно, если перебирать только уникальные цифры, то весь Лонг.МаксВалуе проходит за 4 секунды(если прогнать только его без доп действий и без вывода на экран промежуточных результатов - (с выводом на экран 31 сек)
Я даже придумал "быстрый"(мой первый способ занимал пол часа реального времени) способ проверки является ли число армстронга или нет.
Но столкнулся с проблемой.... по выше описанному алгоритму у меня не прокатывают числа армстронга в которых есть нули)) то есть 370 я не могу определить а 371 могу.
Всему виной то что число 370 = 037 по уникальности чисел, а ещё равно 37 для перевода в режим вычисления суммы степеней.
Как эту проблему победить, пока не знаю...
Я понимаю что мой код "ужасен" для некоторых людей... но прошу помочь, возможно доработать мою идею реализации...
package com.javarush.task.task20.task2025;
import java.util.*;
/*
Алгоритмы-числа
*/
public class Solution {
public static long[] getNumbers(long N) {
long lastLong = 0;
int[] numbers = new int[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//тут массив из 19 знаков, с помощью которого я буду перебирать весь лонг
ArrayList<Long> longArrayList = new ArrayList<>();
N = 10_000;
// N = Long.MAX_VALUE;
int n = 0;
long numLong = 0;
int lenght = numbers.length-1;
while (lastLong<N){
//1--В этом блоке собственно проход всех цифр с условием что "142 и 124" равны-(https://acmp.ru/article.asp?id_text=198)-
n++;
numbers[lenght] = n;
if(n == 10){// тут думаю можно сделать и в один цикл, но пока не понял как...
for (int i = lenght; i >= 0; i--) {//тут измению значения в ячейках массива с его конца
if(numbers[i]>=10){
if(i-1>=0){
numbers[i-1]++;
}
}
}
for (int i = 0; i < lenght+1; i++) {
//если значение в ячейки доходит до 10 то увеличиваю следующую ячейку а текущая не должна быть меньше следующей.
if(numbers[i]>=10){
if(i-1>=0){
numbers[i] = numbers[i-1];
}
}
}
n = numbers[lenght];
}
//-------------------------------------------------------------------------
//2----------------тут я прикидываю а не пора ли закончить перебор----------
String numString = "";
for (int i = 0; i < numbers.length; i++) {
numString +=numbers[i];
}
try {
numLong = Long.parseLong(numString);
}catch (Exception e){
break;
}
lastLong = numLong;
//-------------------------------------------------------------------------
//3--------------------------Тут получаю сумму степеней всех цифр числа------
long summ = 0;
for (int i1 = 0; i1 < numbers.length; i1++) {
summ += (Math.pow(numbers[i1],String.valueOf(numLong).length()));
}
//-------------------------------------------------------------------------
//4-----------Тут я хитро проверяю что сумма степеней от числа армстронга-------
int[] resNumbers = new int[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
ArrayList<Integer> integerArrayList = new ArrayList<>();
for (int i = 0; i < String.valueOf(summ).length(); i++) {
integerArrayList.add(Integer.parseInt(String.valueOf(summ).split("")[i]));
}
integerArrayList.sort(Collections.reverseOrder());
for (int i = 0; i < integerArrayList.size(); i++) {
resNumbers[(resNumbers.length-1)-i] = integerArrayList.get(i);
}
if(Arrays.equals(resNumbers,numbers) ){
longArrayList.add(summ);
// System.out.println(" equals Прокатило");
}
// System.out.println(Arrays.toString(resNumbers));
System.out.println("RESULT= "+Arrays.toString(resNumbers)+"\n"+"ORIGGN= "+Arrays.toString(numbers)+"\n");
//-------------------------------------------------------------------------
//5------------------не помню зачем но пусть будет-----------------------------
if(numbers[0]==10){
break;
}
//-------------------------------------------------------------------------
}
long[] result = new long[longArrayList.size()];
for (int i = 0; i < longArrayList.size(); i++) {
result[i] = longArrayList.get(i);
}
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(1000000)));
// b = System.currentTimeMillis();
// System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
// System.out.println("time = " + (b - a) / 1000);
}
}