public class Solution {
public static long power(long a, long b) { //my method to do Math.pow
long powerResult = 1;
while (b >= 1) {
powerResult = powerResult * a;
b--;
}
return powerResult;
}
public static long[] getNumbers(long N) {
if(N <= 1)return new long[0];
ArrayList<Long> longArrayList = new ArrayList<>();
for (long j = 1; j < N; j++) {
long numberLength = String.valueOf(j).toCharArray().length; //determine number length
char[] charArray = String.valueOf(j).toCharArray(); //charArray consists of digits (for 370 it's 3 7 0)
long sumA = 0; //initialize result of operation
for (int i = 0; i < charArray.length; i++) { //iterate over digits of input number
long sumB = 0; //initialize let's say half-result
char cyfra = charArray[i]; //get current char from array
String cyfraString = Character.toString(cyfra); //change this char to String for later purpose
int cyfraInt = Integer.parseInt(cyfraString); // now change this String to int - I don't know better solution to do this :(
sumB = sumB + power(cyfraInt, numberLength); // adding next results of power to each other
sumA += sumB; // adding to sumA to get the real result of program
}
if (sumA == j) { //check if result is the same as input number
longArrayList.add(j); //same = add to list
}
}
long[] result = new long[longArrayList.size()]; //create standard array from arrayList
for (int i = 0; i < longArrayList.size(); i++) {
result[i] = longArrayList.get(i);
}
return result;
}
for input number 1000 I get array -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407]
for input number 1000000 I get array -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834]
program takes 0 seconds for 1000000 input and takes memory 12156 - is it too much ?
Help guys!package com.codegym.task.task20.task2025;
import java.util.ArrayList;
import java.util.Arrays;
/*
Number algorithms
*/
public class Solution {
public static long potega(long a, long b) {
long wynik = 1;
while (b >= 1) {
wynik = wynik * a;
b--;
}
return wynik;
}
public static long[] getNumbers(long N) {
if(N <= 1)return new long[0];
//System.out.println("Wproadzono liczbe: " + N);
ArrayList<Long> longArrayList = new ArrayList<>();
for (long j = 1; j < N; j++) {
long numberLength = String.valueOf(j).toCharArray().length;
//int numberlength2 = Long.valueOf(N).byteValue()
//System.out.println("numberLength :" + numberLength);
char[] x = String.valueOf(j).toCharArray();
long sumaCalkowita = 0;
for (int i = 0; i < x.length; i++) {
long sumaPoteg = 0;
char cyfra = x[i];
String cyfraString = Character.toString(cyfra);
int cyfraInt = Integer.parseInt(cyfraString);
sumaPoteg = sumaPoteg + potega(cyfraInt, numberLength);
sumaCalkowita += sumaPoteg;
}
//System.out.println("Suma calkowita dla liczby : "+j + " wynosi: " + sumaCalkowita);
if (sumaCalkowita == j) {
longArrayList.add(j);
//System.out.println("Nalezy wpisac liczbe: " + j);
}
}
//System.out.println(longArrayList);
long[] result = new long[longArrayList.size()];
for (int i = 0; i < longArrayList.size(); i++) {
result[i] = longArrayList.get(i);
}
//System.out.println("Wyniki tabeli long[]: ");
//for (int i=0;i< result.length;i++){
// System.out.print(result[i]+", ");
//}
return result;
}
public static void main(String[] args) {
//getNumbers(80000);
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);
}
}