Друзья, прошу помочь, не проходит валидацию, тк при каких - то входных данных выскакивает исключение.
и 0 , и отрицательные ставил значения, счетчик ставил в getNumbers вместо генерации - все ок проблем не увидел, не знаю что еще проверить, может кто подскажет...
Заранее большое спасибо
package com.javarush.task.task20.task2025;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
/*
Алгоритмы-числа
*/
public class Solution {
private static long[][] degreeList = new long[10][20];
private static void setPowLis(long[][] powList){
//создаем матрицу 10х20 и для каждого значения от 0 до 9 считаем степень от 0 до 20
for (int i = 0; i < 10; i++){
for (int j = 0; j < 20; j++) {
powList[i][j] = powElement(i,j); //считаем результат и добавляем в матрицу
}
}
}
public static long powElement(int i, int j) {
long result = i;
if(j < 19) { //9^19 - за границы long выходит один разряд
for (int x = 1; x < j; x++) {
result *= i;
}
} else {
BigInteger newResult = BigInteger.valueOf(result);
for (int x = 1; x < j; x++) {
newResult.multiply(BigInteger.valueOf(i));
}
result = newResult.longValue();
}
return result;
}
public static long[] getNumbers(long N) {
ArrayList<Long> armstrongList = new ArrayList<>();
//Создаем матрицу
setPowLis(degreeList);
//Генеририуем числа
long counter = 1; // numbers 1 >> N
while(counter < N) {
//Условие: prevDigit <= digit <= nextDigit,
//из набора 135, 153, 315, 351, 531 и 513 - нет смысла считать все, достаточно первое попавшееся - 135
if (isIncreaseDigit(counter)) {
long degreeSum = degreeDigitSum(counter);
if(isArmstrong(degreeSum) && !armstrongList.contains(degreeSum) && degreeSum < N) {
armstrongList.add(degreeSum);
}
}
//counter++;
//System.out.println(counter);
counter = nextCounter(counter);
}
Collections.sort(armstrongList);
long[] result = new long[armstrongList.size()];
for (int i = 0; i < armstrongList.size(); i++) {
result[i] = armstrongList.get(i);
}
return result;
}
private static boolean isArmstrong(long degreeSum) {
if (degreeDigitSum(degreeSum) == degreeSum) {
return true;
}
return false;
}
private static long nextCounter(long number) {
int degree = 0;
while(number % 10 == 0) { // ищем в какю степень возводить 10,для сборки нового числа
degree++;
number = number / 10;
}
if (degree == 0) {
return ++number;
}
int lastDigit = (int) number % 10; //получаем целый остаток,для
return number * (long) Math.pow(10,degree) + lastDigit * (long) Math.pow(10, degree - 1);
}
public static boolean isIncreaseDigit(long number) { //Условие: prevDigit <= digit <= nextDigit
int prevDigit = 0;
while (number > 0) {
int digit = (int) number % 10; // if number = 9 then digit = 9;
if((digit > prevDigit || digit == 0) && prevDigit != 0) { // 1 >> 10 - true, etc...
return false;
}
number = number/10; // if number = 371 then number = 37
prevDigit = digit;
}
return true;
}
public static long degreeDigitSum(long number) {
int degree = Long.toString(number).length(); // or (int) Math.log10(num) + 1 ?
long degreeSum = 0;
while (number > 0) {
degreeSum += degreeList[(int) (number % 10)][degree];
number = number / 10;
}
return degreeSum;
}
public static void main(String[] args) {
// /*
long mem1 = Runtime.getRuntime().freeMemory();
long startDate = new Date().getTime();
//*/
long[] x = getNumbers(Integer.MAX_VALUE);
///*
long enddate = new Date().getTime() - startDate;
long mem2 = Runtime.getRuntime().freeMemory();
System.out.println((mem1 - mem2)/(Math.pow(10,6)));
System.out.println("time - " + enddate + "");
for (long v : x) {
System.out.println(v);
}
// */
}
}