Все 50 чисел Армстронга из диапазона long прога выдает.
Результат:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834, 1741725, 4210818, 9800817, 9926315, 24678050, 24678051, 88593477, 146511208, 472335975, 534494836, 912985153, 4679307774, 32164049650, 32164049651, 40028394225, 42678290603, 44708635679, 49388550606, 82693916578, 94204591914, 28116440335967, 4338281769391370, 4338281769391371, 21897142587612075, 35641594208964132, 35875699062250035, 1517841543307505039, 3289582984443187032, 4498128791164624869, 4929273885928088826]
memory 4974
time = 8
Что Вале еще надо?
package com.javarush.task.task20.task2025;
import java.util.*;
/*
Алгоритмы-числа
*/
public class Solution {
public static long[] getNumbers(long N) {
if (N <= 0) return new long[0];
long[] result;
long inputNumber = 8_999_999_999_999_999_999L; //это последнее уникальное натуральное число в диапазоне long
if (N <= inputNumber) inputNumber = N; // если задать выше, то цикл уйдет в рекурсию
///////////////////////////////////////////////////////////////////////////////////
//степенная таблица. Ускоряет работу программы более чем в 2 раза
Long[][] numberInDegree = new Long[11][20];
for (int i = 0; i < 11; i++) {
for (int j = 0; j < 20; j++) {
long res = i;
for (int k = 1; k < j; k++) {
res = res * i;
}
numberInDegree[i][j] = res;
//System.out.print(numbInDegree[i][j] + " ");
}
// System.out.println();
}
//получаем список уникальных чисел и проверяем их на принадлежность числу Армстронга
TreeSet<Long> ArmstrongNumbers = new TreeSet<>();
int sizeOfNumber = (inputNumber + "").length();
long mostMultiple = numberInDegree[10][sizeOfNumber-1];
//(long) Math.pow(10, sizeOfNumber - 1);
for (long i = 1; i < inputNumber; i++) {
long copy = mostMultiple;
long tempI = i;
while (copy >= 10) {
if (i % copy == 0) {
long tempMulti = 10;
while (tempMulti <= copy) {
i = i + ((tempI % (copy * 10)) / (tempMulti));
tempMulti = tempMulti * 10;
}
}
copy = copy / 10;
}
//получили уникальное число и проверяем его
int sizeOfElement = (i + "").length();
long mostMultipleOfElement = numberInDegree[10][sizeOfElement-1];
long copyOfMostMultiple;
//Цикл ниже должен повторятся пока степень возведения не станет равной размеру входящего числа
//таким образом мы проверяем числа 07, 007, 037(которое как раз и станет 370 - числом Армстронга) и т.д.
for (int j = sizeOfElement; j <= sizeOfNumber; j++) {
long result1 = 0;
copyOfMostMultiple = mostMultipleOfElement;
while (copyOfMostMultiple >= 1) {
long digit = (i % (copyOfMostMultiple * 10)) / copyOfMostMultiple;
result1 = result1 + numberInDegree[(int) digit][j];
copyOfMostMultiple = copyOfMostMultiple / 10;
}
//result2 это сумма цифр result1 возведенная в степень длины result1 (для проверки)
long result2 = 0;
int sizeOfResult1 = (result1 + "").length();
long anotherMulti = numberInDegree[10][sizeOfResult1-1];
long tempResult1 = result1;
while (anotherMulti >= 1) {
long digit2 = tempResult1/anotherMulti;
if (digit2<0) break;
result2 = result2 + numberInDegree[(int) digit2][sizeOfResult1];
tempResult1 = tempResult1%anotherMulti;
anotherMulti=anotherMulti/10;
}
// сравнение полученных чисел и добавление в TreeSet
if (result2 == result1 && result1 < inputNumber && result1 != 0) ArmstrongNumbers.add(result1);
}
}
//переводим значения в массив result
result = new long[ArmstrongNumbers.size()];
int index = 0;
for (Long element : ArmstrongNumbers) {
result[index] = element;
index++;
}
return result;
}
public static void main(String[] args) {
long a = System.currentTimeMillis();
System.out.println(Arrays.toString(getNumbers(Long.MAX_VALUE)));
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)));
b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a) / 1000);
}
}