Двумерный массив в качестве матрицы.
Далее заполнение от 1 до 9 без проверок, смысла нет на степени 1.
После - каждое число конвертируется в массив.
Проверка на последовательность цифр по возрастанию игнорируя ноль(устал, потом переделаю на побыстрей)
Если последовательность верная, то высчитывается число Армстронга.
Перед добавлением проверка еще одна.
По времени не ругается, что очень странно.
Но на результат машет пальцем. А я не замечаю где. Беда короче (
Макс значения у себя не прогонял, думаю ждать буду слишком долго.
package com.javarush.task.task20.task2025;
import java.util.*;
/*
Алгоритмы-числа
*/
public class Solution {
public static long[] getNumbers(long N) {
if (N < 0) {
return null;
}
long[] result;
long[][] table = new long[10][20];
for (int i = 1; i < 10; i++) {
long tmp = i;
for (int j = 1; j < 20; j++) {
if (j < 2) {
table[i][j] = j;
} else {
tmp *= i;
}
if (tmp > 0) {
table[i][j] = tmp;
}
}
}
TreeSet<Long> Reslist = new TreeSet<>();
for (long i =1; i < N; i++) {
if(i < 10){
Reslist.add(i);
}else {
long[] values = getArray(i);
if (isOrdered(values)) {
long[] values2 = new long[values.length];
for (int j = 0; j < values.length; j++) {
values2[j] = table[(int) values[j]][values.length];
}
long armstrong = 0;
for (long l : values2) {
armstrong += l;
}
long[] nums = getArray(armstrong);
Arrays.sort(nums);
Arrays.sort(values);
if(Arrays.equals(values, nums) & armstrong < N) {
Reslist.add(armstrong);
}
//System.out.println(armstrong);
}
}
}
result = new long[Reslist.size()];
int i =0;
for(Long l:Reslist){
result[i] = l;
i++;
}
return result;
}
private static boolean isOrdered(long[] N){
boolean flag = true;
for(int i = 0; i<N.length-1; i++){
if(N[i+1] != 0 & N[i] != 0 & N[i] > N[i+1]){
flag = false;
break;
}
}
return flag;
}
private static long[] getArray(long N){
long toArray;
long num = N;
int varLength = getLength(N);
long[] result = new long[varLength];
for (int j = varLength-1; j >=0; ) {
while (num != 0) {
toArray = num % 10;
result[j] = toArray;
num /= 10;
j--;
}
}
return result;
}
private static int getLength(long N){
int result=0;
if(N>= 1000000000000000000L) result = 19;
if(N< 1000000000000000000L) result = 18;
if(N< 100000000000000000L) result = 17;
if(N< 10000000000000000L) result = 16;
if(N< 1000000000000000L) result = 15;
if(N< 100000000000000L) result = 14;
if(N< 10000000000000L) result = 13;
if(N< 1000000000000L) result = 12;
if(N< 100000000000L) result = 11;
if(N< 10000000000L) result = 10;
if(N< 1000000000) result = 9;
if(N< 100000000) result = 8;
if(N< 10000000) result = 7;
if(N< 1000000) result = 6;
if(N< 100000) result = 5;
if(N< 10000) result = 4;
if(N< 1000) result = 3;
if(N< 100) result = 2;
if(N< 10) result = 1;
return result;
}
public static void main(String[] args) {
long a = System.currentTimeMillis();
System.out.println(Arrays.toString(getNumbers(1000000000)));
long b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a));
// a = System.currentTimeMillis();
// System.out.println(Arrays.toString(getNumbers(1000000000)));
// b = System.currentTimeMillis();
// System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
// System.out.println("time = " + (b - a));
}
}
//0, 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.