ВАРИАНТ, КОТОРЫЙ Я СПИСАЛ:
package com.javarush.test.level20.lesson10.bonus01;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/* Алгоритмы-числа
Число 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 МБ памяти.
*/
public class Solution {
public static int[] getNumbers(int N) {
int[] result = null;
List<Integer> list = new ArrayList<>();
for (int n = 1; n < N; n++) {
int sum = 0, temp, r;
int q = 0;
temp = n;
int length = (int) (Math.log10(n) + 1);
while (temp != 0) {
for (int i = 0; i < length; i++) {
int prod = 1;
r = temp % 10;
for (int j = 0; j < length; j++) {
prod = prod * r;
}
sum = sum + prod;
temp = temp / 10;
}
}
if (n == sum) {
list.add(n);
}
}
result = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
result[i] = list.get(i);
}
System.out.println(Arrays.toString(result));
return result;
}
public static void main(String args[]) {
long memoryStart = Runtime.getRuntime().freeMemory();
Long t0 = System.currentTimeMillis();
int[] result = getNumbers(10000000);
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()));
}
}
МОЙ ВАРИАНТ, СЛИШКОМ ДОЛГИЙ:
package com.javarush.test.level20.lesson10.bonus01;
import java.util.ArrayList;
/* Алгоритмы-числа
Число 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 МБ памяти.
*/
public class Solution {
public static void main(String[] args) {
int N = 10000000;
long start = System.currentTimeMillis();
int[] m = getNumbers(N);
long finish = System.currentTimeMillis();
for (int i : m) {
System.out.println(i);
}
System.out.printf("Execution spend %d,%d sec & %d mb of memory.",
((finish - start)/1000), ((finish - start) % 1000), (Runtime.getRuntime().totalMemory()
- Runtime.getRuntime().freeMemory())/1024/1024);
}
public static int[] getNumbers(int N) {
ArrayList<Integer> list = new ArrayList<>();
ArrayList<Integer> listOfPow = new ArrayList<>(); //список степенных сумм чисел Армстронга
for (int i = 0; i < N; i++) {
if (i < 10) list.add(i);
else {
int sum = 0;
int[] digits = new int[String.valueOf(i).length()];
int x = 0;
for (int j = i; j != 0; j /= 10) {
sum += j % 10;
digits[x++] = j % 10;
}
if (!listOfPow.contains(sum)) {
int summ = 0;
for (int digit : digits) {
summ += Math.pow((double) digit, (double) digits.length);
}
if (i == summ) {
list.add(i);
listOfPow.add(sum);
}
}
}
}
int[] result = new int[list.size()];
for (int i = 0; i < result.length; i++) {
result[i] = list.get(i);
}
return result;
}
}
Leave A Comment