ВАРИАНТ, КОТОРЫЙ Я СПИСАЛ:
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