Сократил типы переменных до минимума + добавил многопоточность...
На тесте с числом 8637330 удалось сократить время с 8ми секунд до 3х, но максимальное число от лонг все еще тесты не вывозит...
В какую сторону смотреть?
package com.javarush.task.task20.task2025;
import java.util.ArrayList;
import java.util.Date;
/*
Алгоритмы-числа
*/
public class Solution {
public static long[] getNumbers(long N) {
long[] result = null;
Runnable searcher = new Searcher(N);
Thread t1 = new Thread(searcher);
Thread t2 = new Thread(searcher);
Thread t3 = new Thread(searcher);
Thread t4 = new Thread(searcher);
Thread t5 = new Thread(searcher);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
try {
t1.join();
t2.join();
t3.join();
t4.join();
t5.join();
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("some shit in thread");
}
//for (long i : ((Searcher) searcher).listResult){
// System.out.println(i);
//}
result = new long[((Searcher) searcher).listResult.size()];
for (int i = 0; i < result.length; i++){
result[i] = ((Searcher) searcher).listResult.get(i);
}
return result;
}
public static class Searcher implements Runnable {
private volatile long N;
ArrayList<Long> listResult = new ArrayList<>();
public Searcher(long N) {
this.N = N;
}
@Override
public void run() {
while (N > 0) {
long cloneN;
synchronized (this) {
cloneN = N;
N--;
}
long forGetLastNumber = cloneN;
int length = String.valueOf(cloneN).length();
byte[] numbers = new byte[length];
for (int i = 0; i < length; i++) {
byte num = (byte) (forGetLastNumber % 10);
numbers[i] = num;
forGetLastNumber /= 10;
}
long forResult = 0;
for (byte num : numbers) {
forResult += (long) Math.pow(num, length);
if (forResult > cloneN) break;
}
if (cloneN == forResult) listResult.add(cloneN);
}
}
}
public static void main(String[] args) {
Date start = new Date();
long m = Long.MAX_VALUE;
long n = 8637330;
long [] result = getNumbers(n);
for (long i : result){
System.out.println(i);
}
// getNumbers(n);
Date finish = new Date();
double secs =(double) (finish.getTime() - start.getTime())/1000;
System.out.println(secs);
}
}