Памахите, в общем до 17 знака все ок, значения совпадают с известными на 19 знаке выдает чего-то нето.
Не понимаю где ошибка.
Я там конечно местами наговнокодил, где-то куски кода спер у предыдуших решавших, дабы сократить решение. Метод updateNumber с нуля сам написал с рекурсией.
Если забить число 9_000_000_000_000_000_000L решает за 3с но по Long.MAX_VALUE - висит.
З.Ы. с советами типо создай массив с заранее известными решениями и проверяй чтобы определенное значение было меньше N досвидания.
package com.javarush.task.task20.task2025;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/*
Алгоритмы-числа
*/
public class Solution {
private static long[][] matrix = new long[10][21];
static {
for (int i = 1; i < 10; i++)
for (int j = 1; j < 21; j++)
matrix[i][j] = (long) Math.pow((double) i, (double) j);
}
public static long[] getNumbers(long N) {
long[] result = null;
List<Long> someRes = new ArrayList<>();
long i = 1;
while (i < N){
if (check(i) && !someRes.contains(pow(i))) {
someRes.add(pow(i));
}
i = updateNumber(i);
}
Collections.sort(someRes);
result = new long[someRes.size()];
for (int d = 0; d < someRes.size(); d++){
result[d] = someRes.get(d);
}
return result;
}
public static long updateNumber (long num) {
//int len = (int) Math.log10(num) + 1;
long result = num;
long a = num % 10;
if (num <= 0){
return 1;
} else if (a > 0) {
result++;
} else {
num = num/10;
if (!(num % 10 == 0)) {
result = updateNumber(num - 1) * 10 + num % 10;
} else {
result = updateNumber(num)* 10 + num % 10;
}
}
return result;
}
public static boolean isUnique (long num){
int prev = 0;
while (num > 0) {
int digit = (int) (num % 10);
if( (digit > prev || digit == 0) && prev != 0 ) return false;
num /= 10;
prev = digit;
}
return true;
/*
int current;
int next = 0;
while (a > 0){
current = (int) (a % 10);
a = a/10;
next = (int) (a % 10);
if (current < next) return false;
}
return true;
*/
}
public static long pow(long num){
int len = (int) Math.log10(num) + 1;
long sum = 0;
while (num > 0) {
sum += matrix[(int) (num % 10)][len];
num /= 10;
}
return sum;
}
public static boolean check(long a) {
long res = pow(a);
if (res == pow(res)) {
return true;
} else return false;
}
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(9_000_000_000_000_000_000L)));
b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a) / 1000);
}
}