Здравствуйте! Подскажите что не так сделал?
package com.javarush.task.task20.task2025;
import java.util.*;
public class Solution {
public static long[] getNumbers(long N) {
int bitNum = getBit(N);//Разрядность числа
List<Long> rezList = new LinkedList<>();// В этом листе будем харнить результат - найденные числа
long[] mass = new long[bitNum]; //С помощью данного массива будем "собирать" уникальные комбинации чисел
long K = 0l;//Число которое в настоящий момент проверяем
long[][] powMatrix = new long[11][bitNum + 1];
for (int i = 0; i < 10; i++) {
for (int j = 0; j <= bitNum; j++) {
powMatrix[i][j] = (long) Math.pow(i, j);
}
}
while (true) {
getIncrementMass(mass, bitNum);//Получаем следующую комбинацию. Например число 577 будет выглядить как [0,0,5,7,7]
//Получаем текущее, обрабатываемое число K
K = 0;
for (int i = 0; i < bitNum; i++) {
K += mass[i] * Math.pow(10, bitNum - i - 1);
}
if (K > N||K == N)
break;
int tempBit = getBit(K);
for (int j = tempBit; j < bitNum; j++) {
long KTemp = (long) (K * Math.pow(10, j - tempBit));
//У нас есть массив цифр иденфифицирующих наше число(например 577 = [0,0,5,7,7])
//Из полученной комбинации получаем число амстронга
long amstr1 = 0l;
int bitK = getBit(KTemp);
boolean b = true;
for (int i = 0; i < mass.length; i++) {
// amstr1 += Math.pow(mass[i], bitK);
amstr1 += powMatrix[(int) mass[i]][bitK];
}
//Теперь проверяем что полученное число amstr1 так же является числом амстронга
//Тут сплитим, так как это наиболее простой, но к сожелению наиболее затратный метод. Выбираем простоту
String[] array = String.valueOf(amstr1).split("");
long amstr2 = 0l;
for (int i = 0; i < array.length; i++) {
//amstr2 += Math.pow(Integer.parseInt(array[i]), array.length);
amstr2 += powMatrix[Integer.parseInt(array[i])][array.length];
}
if (amstr1 == amstr2 && !rezList.contains(amstr2)) {
rezList.add(amstr2);
}
}
}
long[] result = new long[rezList.size()];
for (int i = 0; i < rezList.size(); i++) {
result[i] = rezList.get(i);
}
Arrays.sort(result);
return result;
}
/**
* Метод возвращает разрядность числа. работает бысрее чем работа через строку
*/
static int getBit(long x) {
long p = 10;
for (int i = 1; i < 19; i++) {
if (x < p)
return i;
p = 10 * p;
}
return 19;
}
/**
* Метод добавлет разряд нашему массиву в котром поразрядно записано число
*/
static void getIncrementMass(long[] mass, int bit) {
bit--;//так как длинна на 1 меньше индекса
if (mass[bit] == 9) {
if (bit != 0) {
getIncrementMass(mass, bit);
mass[bit] = mass[bit - 1];
}
} else {
mass[bit] = ++mass[bit];
}
}
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(Long.MAX_VALUE)));
b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a) / 1000);
}
}