Просидел несколько часов над задачей. Не знаю, как правильно реализовать проверку, является ли найденное число числом Армстронга. Вопрос в том, стоит ли ещё редактировать это решение или лучше менять решение?
package com.javarush.task.task20.task2025;
import java.util.ArrayList;
/*
Алгоритмы-числа
*/
public class Solution {
private static long[] getNumbers(long N) {
long[] result = new long[1000];
int count = 0;
long firstResult = 0;
for (long i=0; i<N; i++){
getDigits(i);
int i1 = digits.size();
if (IsIncreasing()){
for (int place = 0; place< digits.size(); place++){
long tr = digits.get(place);
int fin = (int) tr;
firstResult += degreesOfNumbers[fin][digits.size()];
}
digits.clear();
getDigits(firstResult);
long second = firstResult;
firstResult = 0;
int i2 = digits.size(); //проверка суммы квадрата с самим числом (как сделать?)
if (i1==i2 && second == i){ //Ошибка в проверке
res.add(second);
count++;
}
}
digits.clear();
result = new long[res.size()];
for (int t=0; t<res.size(); t++){
result[t] = res.get(t);
}
}
return result;
}
private static ArrayList<Long> res = new ArrayList<>();
private static long[][] degreesOfNumbers = new long[10][17];
static {
for (int i = 1; i < 10; i++)
for (int j = 1; j < 17; j++)
degreesOfNumbers[i][j] = (long) Math.pow((double) i, (double) j);
}
public static boolean IsIncreasing(){
if (counterOfDigits==1) return true;
for (int i=0; i<digits.size()-1; i++){
if (digits.get(i)<=digits.get(i+1)||digits.get(i+1)==0){
} else return false;
}
return true;
}
private static int counterOfDigits;
private static ArrayList<Long> digits = new ArrayList<>();
private static void getDigits(long number){
long ourNumber = number;
counterOfDigits = CounterOfDigits.getCountsOfDigits(number);
for (int i=0; i<counterOfDigits; i++){
if (counterOfDigits==1 && (number>=0 && number<=9)){
digits.add(0, number);
}
else if (ourNumber/10!=0){
digits.add(0, ourNumber%10);
ourNumber = ourNumber/10;
} else digits.add(0, ourNumber%10);
}
}
public static void main(String[] args) {
/*long startTime = System.currentTimeMillis();
long[] res = getNumbers(10_000_000_0L);
System.out.println(Arrays.toString(res));
long timeSpent = System.currentTimeMillis() - startTime;
System.out.println("программа выполнялась " + timeSpent + " миллисекунд");
System.out.println("memory: " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1000000 + " MB");*/
}
}