Вывод:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407]
memory 256
time = 0
[1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834]
memory 681
time = 0
Если N = 8, вывод на консоли: [1, 2, 3, 4, 5, 6, 7]
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 {
public static long[] getNumbers(long N) {
long[] result = null;
List<Long> longList = new ArrayList<>();
if (N > 0 && N < 10) {
int n = (int) N;
for (int i = 1; i < n; i++) longList.add((long) i);
} else if (N >= 10) {
for (int i = 1; i < 10; i++) longList.add((long) i);
long currentNumber = 10;
while (currentNumber < N) {
long sum = 0;
int currentNumberLength = ("" + currentNumber).length();
//Сумма цифр старших разрядов
for (int i = 0; i < currentNumberLength - 1; i++) {
sum += Math.pow(Integer.parseInt("" + ("" + currentNumber).charAt(i)), currentNumberLength);
}
//Значение цифры младшего разряда
for (int i = 0; i < 10; i++) {
if (currentNumber + (long) i < N &&
sum + (long) Math.pow(i, currentNumberLength) == currentNumber + (long) i) {
longList.add(currentNumber + (long) i);
}
}
currentNumber += 10;
}
}
int listLength = longList.size();
result = new long[listLength];
for (int i = 0; i < listLength; i++) {
result[i] = longList.get(i);
}
return result;
}
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(1000000)));
b = System.currentTimeMillis();
System.out.println("memory " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / (8 * 1024));
System.out.println("time = " + (b - a) / 1000);
}
}
/*
Число S состоит из M цифр, например, S=370 и M (количество цифр) = 3
Реализовать логику метода getNumbers, который должен среди натуральных чисел меньше N (long)
находить все числа, удовлетворяющие следующему критерию:
число S равно сумме его цифр, возведенных в M степень.
getNumbers должен возвращать все такие числа в порядке возрастания.
Пример искомого числа:
370 = 3*3*3 + 7*7*7 + 0*0*0
8208 = 8*8*8*8 + 2*2*2*2 + 0*0*0*0 + 8*8*8*8
На выполнение дается 10 секунд и 50 МБ памяти.
Метод main не участвует в тестировании.
Requirements:
1. В классе Solution должен присутствовать метод public static long[] getNumbers(long N)
2. В методе getNumbers не должно возникать исключений, при любых входных данных.
3. Все найденные числа должны быть строго меньше N. Х
4. Метод getNumbers должен возвращать массив чисел удовлетворяющих условию задачи. Х
ментор: В массиве возвращаемом методом getNumbers не хватает элементов или есть лишние.
*/