Всем привет. Прошу помочь.
код ниже
public class Solution {
public static long[] getNumbers(long N) {
if(N>0)
{
long[][] multArray = new long[10][10]; // Создаем и заполняем массив числами в нужной степени
for (int i = 0; i < multArray.length; i++) { // получаем матрицу степеней
for (int j = 1; j < multArray[i].length; j++) { //
multArray[i][j] = (long) Math.pow(i, j); //
}
}
long[] result = null;
List<Integer> list = new ArrayList<>();
for (int n = 0; n <= N; n++) {
if (n >= 0 && n < 10) { // все числа от 1 до 10 сразу пишем в лист
if(n!=0) list.add(n); //
} else{ //
long sum = 0, tempvar;
int number;
tempvar = n;
int length = (int) (Math.log10(n) + 1); // считаем длину цифры, она же будет степенью числа
while (tempvar != 0) {
for (int i = 0; i < length; i++) {
number = (int)tempvar % 10; // получаем первую цифру числа
sum = sum + multArray[number][length]; // возводим ее в степень (берем значение из матрицы степеней)
tempvar = tempvar / 10;
}
}
if (n == sum) { //если число Армстронга => в лист
list.add(n);
}
}
}
result = new long[list.size()]; // list в массив
for (int i = 0; i < list.size(); i++) {
result[i] = list.get(i);
}
System.out.println(Arrays.toString(result));
return result;}
else return null; // если входное число отрицательное
}
public static void main(String[] args) {
// проверка
long start = (new Date()).getTime();
long[] result = getNumbers(100000000);
long end = (new Date()).getTime();;
System.out.println("Time = " + (end - start));
// результат
//[1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834, 1741725, 4210818, 9800817, 9926315, 24678050, 24678051, 88593477]
//Time = 5429
}
}
Валя ругается по следующему пункту
"Проверь, что в методе getNumbers не возникает исключения, при любых входных данных."
Мне что проверять то? значение N или то, что N является числом?
И Второй вопрос. Решение у меня самое простое, поэтому долгое. в 10сек естественно никак.
Как оптимизировать?
Прочел все что можно, все пишут про уменьшение количества чисел благодаря этому:
"Сам же перебор осуществляется довольно просто : рассматриваются все числа, у которых любая цифра не меньше предыдущей и не больше последующей. Например: 12, 1557, 333 и т.д." но сюда не подходят половина чисел Армстронга (371, 407, 1634, 8208, 9474, 54748....). Может я смысл не понял, просьба тогда пояснить.
package com.javarush.task.task20.task2025;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/*
Алгоритмы-числа
*/
public class Solution {
public static long[] getNumbers(long N) {
if(N>0){
long[][] multArray = new long[10][10];
// System.out.println(multArray.length);
// System.out.println(multArray[0].length);
for (int i = 0; i < multArray.length; i++) {
for (int j = 1; j < multArray[i].length; j++) {
multArray[i][j] = (long) Math.pow(i, j);
}
}
long[] result = null;
List<Integer> list = new ArrayList<>();
for (int n = 0; n <= N; n++) {
if (n >= 0 && n < 10) {
if(n!=0) list.add(n);
} else{
long sum = 0, temp;
int r;
int q = 0;
temp = n;
int length = (int) (Math.log10(n) + 1);
while (temp != 0) {
for (int i = 0; i < length; i++) {
r = (int) temp % 10;
sum = sum + multArray[r][length];
temp = temp / 10;
}
}
if (n == sum) {
list.add(n);
}
}
}
result = new long[list.size()];
for (int i = 0; i < list.size(); i++) {
result[i] = list.get(i);
}
System.out.println(Arrays.toString(result));
return result;}
else return null;
}
public static void main(String[] args) {
long memoryStart = Runtime.getRuntime().freeMemory();
Long t0 = System.currentTimeMillis();
long[] result = getNumbers(-2);
long memoryEnd = Runtime.getRuntime().maxMemory();
long memoTaken = memoryStart - memoryEnd;
System.out.println(memoTaken);
Long t1 = System.currentTimeMillis();
System.out.println("Time need to create the arrray = " + (t1 - t0));
System.out.println("Used Memory in JVM: " + (Runtime.getRuntime().maxMemory() - Runtime.getRuntime().freeMemory()));
}
}