Неделю решаю, Long.Max за 18 секунд, ну ругается что долго уже хорошо. Но почему то условие №3 не выполняется, где чиcла больше N ?
package com.javarush.task.task20.task2025;
import java.util.*;
/*
Алгоритмы-числа
*/
public class Solution {
/*
Алгоритмы-числа
*/
static long[][] pows;
static long[] digit;
static long[] tempDigit;
static ArrayList<long[]> arrayUniqueDigit = new ArrayList<long[]>();
static ArrayList<long[]> uniquePlus = new ArrayList<long[]>();
static TreeSet<Long> rezultLong = new TreeSet<>();
static int razmer;
static long summaPows;
static long limit;
public static void genPows(int razryad){
pows = new long[10][razryad+1];
for (int i= 0; i<pows.length;i++){
long p = 1;
for (int j= 0;j<pows[i].length;j++){
pows[i][j] = p;
p = p*i;
}
}
}
public static void genDigit(int razmer){
digit = new long[razmer];
Arrays.fill(digit, 9);
}
private static boolean decrementArray(long[] intArray) {
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 steppenayaSumma(long[] intArray){
summaPows = 0;
for (int i = 0;i<intArray.length;i++){
summaPows = summaPows + pows[(int) intArray[i]][intArray.length];
}
if (summaPows<0) summaPows = 0;
return summaPows;
}
public static void digittoArray(long inDigit){
Long tmp = inDigit;
ArrayList<Long> tempArray = new ArrayList<>();
while (tmp>0){
tempArray.add(tmp%10);
tmp = tmp / 10;
}
int i =0;
tempDigit = new long[tempArray.size()];
for (long dig:tempArray) {
tempDigit[i] = dig;
i++;
}
}
public static void isArmstrong(long[] inDigit){ // Проверяем числа на число армстронга //
long summaOne = steppenayaSumma(inDigit);
long summaTwo = 0;
if (summaPows<limit){
digittoArray(summaPows);
summaTwo = steppenayaSumma(tempDigit);
}
if (summaOne == summaTwo) {
if ((summaOne<limit)&&(summaOne>=1)){
rezultLong.add(summaOne);
}
}
}
public static long[] getNumbers(long N) {
if (N <= 1) return new long[0];
limit = N;
razmer = String.valueOf(N).length();
genPows(razmer); // Создание массива степеней //
genDigit(razmer); // Создание массива для поиска уникальных чисел размером с заданный предел //
while (decrementArray(digit)){ // Создаем массив уникальных чисел //
long[] tempDigit = Arrays.copyOf(digit,digit.length);
isArmstrong(tempDigit);
decrementZero(tempDigit);
}
long[] result = new long[rezultLong.size()];
int i = 0;
for (long dig:rezultLong) {
result[i] = dig;
i +=1;
}
return result;
}
public static void decrementZero(long[] inputArray ){
for (int i = 0; i <inputArray.length;i++){
if (inputArray[i]==0){
long[] tempDigit = Arrays.copyOfRange(inputArray,i+1,inputArray.length);
isArmstrong(tempDigit);
uniquePlus.add(tempDigit);
}
}
}
public static void main(String[] args) {
long a = System.currentTimeMillis();
System.out.println(Arrays.toString(getNumbers(Integer.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);
}
}