Подскажите, как тут еще сократить время работы программы. Когда числа подходят к миллионам, пишет, что использую бесконечный цикл.
package com.javarush.task.task20.task2025;
import java.util.*;
/*
Алгоритмы-числа
*/
public class Solution {
public static long[] getNumbers(long N) throws Exception {
ArrayList<Long> list = new ArrayList<>();
for (long i=1; i<N; i++) {
if (i < 100) {
if (isArmStrong(i) == true) {
list.add(i);
}
}else {
String s = "" + i;
char[] digits = s.toCharArray();
int len = digits.length;
boolean ok = true;
if (!s.substring(s.length()-1).equals("0")) {
for (int j=0; j<len-1; j++) {
if (digits[j] > digits[j+1]) {
//System.out.println("Число " + i + " какаха");
ok = false;
}
}
}
if (ok == true) {
long result = 0;
//System.out.println("Проверяю число " + i);
for (int k=0; k<len; k++) {
long dig = Character.getNumericValue(digits[k]);
result += Math.pow(dig, len);
}
if (isArmStrong(result) == true) {
if (result < N && !list.contains(result)) {
list.add(result);
}
}
}
}
}
Collections.sort(list);
long[] result = new long[list.size()];
for (int i=0; i<list.size(); i++) {
result[i] = list.get(i);
}
return result;
}
public static boolean isArmStrong(long param) throws Exception {
if (param > 0) {
String s = "" + param;
char[] digits = s.toCharArray();
int len = digits.length;
long result = 0;
for (int i=0; i<len; i++) {
long dig = Character.getNumericValue(digits[i]);
result += Math.pow(dig, len);
}
if (param == result) {
return true;
}else return false;
}
else return false;
}
public static void main(String[] args) throws Exception {
Solution s = new Solution();
long[] l = s.getNumbers(380);
for (long i : l) {
System.out.print(i + ", ");
}
}
}