Помогите с последним пунктом.
При подстановке Long.MAX_VALUE - последовательность совпадает только до 17-значных чисел, потом начинается расхождение:
ПОСЛЕДОВАТЕЛЬНОСТЬ В ИНТЕРНЕТЕ https://qastack.ru/codegolf/83272/all-armstrong-numbers :
после чисел
4338281769391370
4338281769391371
здесь идут
21897142587612075
5641594208964132
35875699062250035
1517841543307505039
3289582984443187032
4498128791164624869
4929273885928088826
ПОСЛЕДОВАТЕЛЬНОСТЬ ПРИ ВЫПОЛНЕНИИ МОЕГО КОДА:
после чисел
4338281769391370
4338281769391371
у меня идут идут 1663747485940458246 и 8394598099560940629
проверить руками у меня нет возможности, неужели алгоритм работал для других чисел а для 17-19 значных с перебоем...
package com.javarush.task.task20.task2025;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import java.util.stream.Collectors;
/*
Алгоритмы-числа
*/
public class Solution {
static long[] arrayNum;
static long[][] matrix = new long[9][19];
static {
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 19; j++) {
matrix[i][j] = (long) (Math.pow(i + 1d, j + 1d));
}
}
}
static long compareSum(long[] array) {
long sum1 = 0;
long sum2 = 0;
for (long e : arrayNum) {
if (e == 0) {
continue;
}
sum1 = sum1 + matrix[(int) e - 1][array.length - 1];
if (sum1 < 0L) {
return -1L;
}
}
long[] temp = new long[String.valueOf(sum1).length()];
for (int i = 0; i < String.valueOf(sum1).length(); i++) {
temp[i] = String.valueOf(sum1).charAt(i) - '0';
}
for (long e : temp) {
if (e == 0) {
continue;
}
sum2 = sum2 + matrix[(int) e - 1][String.valueOf(sum1).length() - 1];
if (sum2 > sum1) {
return -1L;
}
}
return sum1 == sum2 ? sum1 : -1;
}
static void decrementArray() {
for (int i = 0; i < arrayNum.length; i++) {
if (arrayNum[i] != 0) {
arrayNum[i]--;
break;
}
while (arrayNum[i] == 0) {
i++;
}
--arrayNum[i];
for (int j = 0; j < i; j++) {
arrayNum[j] = arrayNum[i];
}
break;
}
}
public static long[] getNumbers(long N) {
long[] result = new long[0];
Set<Long> set = new TreeSet<>();
if (N > 0L) {
int cap = String.valueOf(N).length();
arrayNum = new long[cap];
for (int i = 0; i < cap; i++) {
arrayNum[i] = 9;
}
while (!Arrays.stream(arrayNum).allMatch(e -> e == 0)) {
long sum = compareSum(arrayNum);
if (sum != -1) {
set.add(sum);
}
compareSum(arrayNum);
long[] temp;
for (int i = 0; i < arrayNum.length - 1; i++) {
temp = new long[arrayNum.length - i - 1];
long tmpSum = 0;
if (arrayNum[i] == 0) {
for (int j = 0; j < arrayNum.length - i - 1; j++) {
temp[j] = arrayNum[j + 1];
}
tmpSum = compareSum(temp);
if (tmpSum != -1) {
set.add(tmpSum);
break;
}
}
}
decrementArray();
}
set = new TreeSet<>(set.stream().filter(e -> e < N).collect(Collectors.toSet()));
result = new long[set.size()];
Long[] wrapperResult = set.toArray(new Long[set.size()]);
for (int i = 0; i < wrapperResult.length; i++) {
result[i] = wrapperResult[i];
}
}
return result;
}
public static void main(String[] args) {
long a = System.currentTimeMillis();
System.out.println(Arrays.toString(getNumbers(1000)));
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(1_000_000_000)));
b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a) / 1000);
}
}