Как я понял под этими пунктами может крыться что угодно, и как тогда понять где закавырка?
package com.javarush.task.task20.task2025;
import java.math.BigInteger;
import java.sql.Array;
import java.util.*;
/*
Алгоритмы-числа
*/
public class Solution {
private static int[] intArray;
private static boolean decrementArray() {
int index = 0;
while (index < intArray.length && intArray[index] == 0) {
index++;
}
if (index + 1 == intArray.length && intArray[index] == 1) {
return false;
}
Arrays.fill(intArray, 0, index + 1, intArray[index] - 1);
return true;
}
public static long[] getNumbers(long N) {
long[] result;
long copyN = N;
long multiplySum;
long multiplySumSecond = 0;
int sizeN = 0;
TreeSet<Long> massive = new TreeSet<>();
long[][] multiplyMassive = new long[10][20];
for (int i = 1; i < 10; i++) {
for (int j = 1; j < 20; j++) {
//multiplyMassive[i][j] = (long) Math.pow(i, j);
multiplyMassive[i][j] = new BigInteger((i) + "").pow(j).longValue();
}
}
while (copyN != 0) {
copyN /= 10;
sizeN++;
}
intArray = new int[sizeN];
Arrays.fill(intArray, 9);
while (decrementArray()) {
multiplySum = 0L;
if (sizeN >= 2) {
if (intArray[sizeN - 2] == 0 && intArray[intArray.length - 1] == 1) {
int[] intArrayCopy;
intArrayCopy = Arrays.copyOfRange(intArray, 1, intArray.length);
intArray = intArrayCopy;
sizeN -= 1;
Arrays.fill(intArray, 9);
}
}
for (int i = 0; i < intArray.length; i++) {
multiplySum += (multiplyMassive[intArray[i]][sizeN]);
}
if (multiplySum > 0) {
int sizeMultiplySum = 0;
long digit;
long multiplySumCopy1 = multiplySum;
long multiplySumCopy2 = multiplySum;
while (multiplySumCopy1 != 0) {
sizeMultiplySum++;
multiplySumCopy1 /= 10;
}
int[] intMultiplySum = new int[sizeMultiplySum];
for (int j = intMultiplySum.length - 1; j >= 0; j--) {
digit = multiplySumCopy2 % 10;
intMultiplySum[j] = (int) digit;
multiplySumCopy2 /= 10;
}
multiplySumSecond = 0;
for (int i = 0; i < intMultiplySum.length; i++) {
int f = intMultiplySum[i];
multiplySumSecond += multiplyMassive[f][sizeMultiplySum];
}
}
if ((multiplySum == multiplySumSecond && multiplySum < N)) {
massive.add(multiplySum);
}
}
result = new long[massive.size()];
int i = 0;
for (Long aLong : massive) {
result[i] = aLong;
i++;
}
return result;
}
// static MuThread1 muThread1;
public static void main(String[] args) throws InterruptedException {
long a = System.currentTimeMillis();
System.out.println(Arrays.toString(getNumbers(Long.MAX_VALUE)));
// long N = 400000000;
// muThread1 = new MuThread1(N);
// Thread thread1 = new Thread(muThread1);
// thread1.start();
// thread1.join();
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(380)));
b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a) / 1000);
}
}