Advertisement
Guest User

Untitled

a guest
Dec 12th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.75 KB | None | 0 0
  1. package com.javarush.task.task20.task2025;
  2.  
  3. import java.text.SimpleDateFormat;
  4. import java.util.*;
  5. import java.util.stream.Collectors;
  6.  
  7. /*
  8. Алгоритмы-числа
  9. */
  10. public class Solution {
  11.  
  12.     public static long[][] degreeMatrix = new long[10][19];
  13.  
  14.     static {
  15.         for (int i = 0; i < 10; i++) {
  16.             for (int j = 1; j <= 19; j++) {
  17.                 long powered = i;
  18.                 for (int k = 0; k < j-1; k++) {
  19.                     powered *= i;
  20.                 }
  21.  
  22.                 degreeMatrix[i][j-1] = powered;
  23.             }
  24.         }
  25.     }
  26.  
  27.     public static long[] getNumbers(long N) {
  28.         long[] result = null;
  29.         List<Long> resultList = new ArrayList<>();
  30.         byte numDigitsOfN = digitsNum(N);
  31.  
  32.         //Первые 9 чисел (M = 1) точно полходят, добавляем
  33.         for (long i = 1; i <= 9; i++) {
  34.             if (i < N)
  35.                 resultList.add(i);
  36.         }
  37.  
  38.         //Обрабатываем числа с разрядностью 2 и выше
  39.         for (byte M = 2; M <= numDigitsOfN; M++) {
  40.             byte[] digits = new byte[M];
  41.             digits[0] = 1;
  42.             byte pos = 0;
  43.  
  44.             while ((digits[0] != 9) || (digits[M-1] != 9)) {
  45.                 pos = (byte)((pos + 1) % M);
  46.  
  47.                 //Если мы на последней позиции
  48.                 if (pos == M-1) {
  49.                     if (digits[M-2] > digits[M-1]) {
  50.                         digits[M-1]++;
  51.  
  52.                         //printArray(digits);
  53.                         long num = getNumber(digits);
  54.                         if ((num != 0) && (num < N))
  55.                             resultList.add(num);
  56.  
  57.                         pos = (byte)(pos-1);
  58.                         continue;
  59.                     } else {
  60.                         continue;
  61.                     }
  62.                 }
  63.  
  64.                 //Если на любой, кроме последней
  65.                 boolean flag = true;
  66.                 for (byte i = (byte)(pos+1); i < M; i++) {
  67.                     if (digits[pos] != digits[i]) {
  68.                         flag = false;
  69.                         break;
  70.                     }
  71.                 }
  72.                 if (flag) {
  73.                     digits[pos]++;
  74.                     for (byte i = (byte)(pos+1); i < digits.length; i++) {
  75.                         digits[i] = 0;
  76.                     }
  77.  
  78.                     //printArray(digits);
  79.                     long num = getNumber(digits);
  80.                     if ((num != 0) && (num < N))
  81.                         resultList.add(num);
  82.                 }
  83.             }
  84.         }
  85.  
  86.         result = new long[resultList.size()];
  87.         for (int i = 0; i < resultList.size(); i++) {
  88.             result[i] = resultList.get(i);
  89.         }
  90.  
  91.         return result;
  92.     }
  93.  
  94.  
  95.     public static void printArray(int[] array) {
  96.         for (int i = 0; i < array.length; i++) {
  97.             System.out.print(array[i]);
  98.         }
  99.         System.out.println();
  100.     }
  101.  
  102.  
  103.     public static byte digitsNum(long N) {
  104.         long p = 10;
  105.  
  106.         for (byte i = 1; i < 19; i++) {
  107.             if (N < p) {
  108.                 return i;
  109.             }
  110.             p *= 10;
  111.         }
  112.  
  113.         return (byte)19;
  114.     }
  115.  
  116.  
  117.     public static long getNumber(byte[] array) {
  118.         long sum = 0;
  119.         for (byte i = 0; i < array.length; i++) {
  120.             //sum += (long)Math.pow(array[i], array.length);
  121.             /*long powered = array[i];
  122.             for (int j = 0; j < array.length-1; j++) {
  123.                 powered *= array[i];
  124.             }
  125.             sum += powered;*/
  126.  
  127.             sum += degreeMatrix[array[i]][array.length-1];
  128.         }
  129.         long savedSum = sum;
  130.         byte digitsNumOfSum = digitsNum(sum);
  131.         byte[] digitsOfSum = new byte[digitsNumOfSum];
  132.         for (byte i = 0; i < digitsOfSum.length; i++) {
  133.             digitsOfSum[digitsOfSum.length-1-i] = (byte)(sum % 10);
  134.             sum = sum / 10;
  135.         }
  136.  
  137.         Arrays.sort(digitsOfSum);
  138.         for(byte i = 0; i < digitsOfSum.length / 2; i++)
  139.         {
  140.             byte temp = digitsOfSum[i];
  141.             digitsOfSum[i] = digitsOfSum[digitsOfSum.length - i - 1];
  142.             digitsOfSum[digitsOfSum.length - i - 1] = temp;
  143.         }
  144.  
  145.         boolean flag = true;
  146.         if (digitsOfSum.length != array.length)
  147.             flag = false;
  148.         else {
  149.             for (byte i = 0; i < digitsOfSum.length; i++) {
  150.                 if (digitsOfSum[i] != array[i]) {
  151.                     flag = false;
  152.                     break;
  153.                 }
  154.             }
  155.         }
  156.         if (flag) {
  157.             return savedSum;
  158.         }
  159.         return 0;
  160.     }
  161.  
  162.  
  163.     public static void main(String[] args) {
  164.  
  165.         /*System.out.println("Waiting 10 sec before start processing...");
  166.         try {
  167.             Thread.sleep(10_000);
  168.         } catch (InterruptedException e) {
  169.         }*/
  170.  
  171.         Date start = new Date();
  172.         Runtime runtime = Runtime.getRuntime();
  173.         long memStart = runtime.totalMemory() - runtime.freeMemory();
  174.  
  175.         long[] result = getNumbers(Long.MAX_VALUE);
  176.  
  177.         Date stop = new Date();
  178.         long memStop = runtime.totalMemory() - runtime.freeMemory();
  179.  
  180.         int curDigitsNum = 0;
  181.         int oldDigitsNum = 0;
  182.         for (int i = 0; i < result.length; i++) {
  183.             curDigitsNum = digitsNum(result[i]);
  184.             if (curDigitsNum != oldDigitsNum) {
  185.                 System.out.println();
  186.                 System.out.println("number of digits = " + curDigitsNum + ":");
  187.                 oldDigitsNum = curDigitsNum;
  188.             }
  189.             System.out.println(result[i]);
  190.         }
  191.         System.out.println();
  192.  
  193.         System.out.println("total number of such numbers: " + result.length);
  194.  
  195.  
  196.         for (int i = 0; i < result.length; i++) {
  197.             long a = result[i];
  198.             int digitsNum = digitsNum(a);
  199.             int[] digits = new int[digitsNum];
  200.             for (int j = 0; j < digits.length; j++) {
  201.                 digits[digits.length-1-j] = (int)(a % 10);
  202.                 a = a / 10;
  203.             }
  204.             long sum = 0;
  205.             for (int j = 0; j < digits.length; j++) {
  206.                 //sum += Math.pow(digits[j], digits.length);
  207.                 long powered = digits[j];
  208.                 for (int k = 0; k < digits.length-1; k++) {
  209.                     powered *= digits[j];
  210.                 }
  211.                 sum += powered;
  212.             }
  213.             if (sum != result[i])
  214.                 System.out.println("This number isn't correct: " + result[i]);
  215.         }
  216.  
  217.         System.out.println("working time: " + (stop.getTime() - start.getTime()) + " ms");
  218.         System.out.println("Used memory: " + (memStop - memStart));
  219.  
  220.     }
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement