Advertisement
Vladislav8653

Untitled

Feb 20th, 2023
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.10 KB | None | 0 0
  1. package by.it.a_khmelev.lesson01;
  2.  
  3. import java.math.BigInteger;
  4.  
  5. /*
  6.  * Вам необходимо выполнить рекурсивный способ вычисления чисел Фибоначчи
  7.  */
  8.  
  9. public class FiboA {
  10.  
  11.  
  12.     private long startTime = System.currentTimeMillis();
  13.  
  14.     public static void main(String[] args) {
  15.         FiboA fibo = new FiboA();
  16.         int n = 33;
  17.         System.out.printf("calc(%d)=%d \n\t time=%d \n\n", n, fibo.calc(n), fibo.time());
  18.  
  19.         //вычисление чисел фибоначчи медленным методом (рекурсией)
  20.         fibo = new FiboA();
  21.         n = 34;
  22.         System.out.printf("slowA(%d)=%d \n\t time=%d \n\n", n, fibo.slowA(n), fibo.time());
  23.     }
  24.  
  25.     private long time() {
  26.         long res = System.currentTimeMillis() - startTime;
  27.         startTime = System.currentTimeMillis();
  28.         return res;
  29.     }
  30.  
  31.     private int calc(int n) {
  32.         if (n < 2) return n;
  33.         return calc (n - 1) + calc(n - 2);
  34.     }
  35.  
  36.  
  37.     BigInteger slowA(Integer n) {
  38.         if (n == 0) return BigInteger.ZERO;
  39.         if (n == 1) return BigInteger.ONE;
  40.         return slowA (n - 1).add(slowA (n - 2));
  41.     }
  42.  
  43.  
  44. }
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58. package by.it.a_khmelev.lesson01;
  59.  
  60. import java.math.BigInteger;
  61.  
  62. /*
  63.  * Вам необходимо выполнить способ вычисления чисел Фибоначчи с вспомогательным массивом
  64.  * без ограничений на размер результата (BigInteger)
  65.  */
  66.  
  67. public class FiboB {
  68.  
  69.     private long startTime = System.currentTimeMillis();
  70.  
  71.     private long time() {
  72.         return System.currentTimeMillis() - startTime;
  73.     }
  74.  
  75.     public static void main(String[] args) {
  76.  
  77.         //вычисление чисел простым быстрым методом
  78.         FiboB fibo = new FiboB();
  79.         int n = 55555;
  80.         System.out.printf("fastB(%d)=%d \n\t time=%d \n\n", n, fibo.fastB(n), fibo.time());
  81.     }
  82.  
  83.     BigInteger fastB(Integer n) {
  84.         BigInteger result = BigInteger.ZERO;
  85.         BigInteger prev = BigInteger.ONE;
  86.         BigInteger prevprev = BigInteger.ZERO;
  87.         int i = 2;
  88.         while (i <= n) {
  89.             result = prev.add(prevprev);
  90.             prevprev = prev;
  91.             prev = result;
  92.             i++;
  93.         }
  94.         return result;
  95.     }
  96. }
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111. package by.it.a_khmelev.lesson01;
  112.  
  113. /*
  114.  * Даны целые числа 1<=n<=1E18 и 2<=m<=1E5,
  115.  * необходимо найти остаток от деления n-го числа Фибоначчи на m.
  116.  * время расчета должно быть не более 2 секунд
  117.  */
  118.  
  119. import java.math.BigInteger;
  120.  
  121. public class FiboC {
  122.  
  123.     private long startTime = System.currentTimeMillis();
  124.  
  125.     private long time() {
  126.         return System.currentTimeMillis() - startTime;
  127.     }
  128.  
  129.     public static void main(String[] args) {
  130.         FiboC fibo = new FiboC();
  131.         int n = 18;
  132.         int m = 4;
  133.         System.out.printf("fasterC(%d)=%d \n\t time=%d \n\n", n, fibo.fasterC(n, m), fibo.time());
  134.     }
  135.  
  136.     long fasterC(long n, int m) {
  137.         //Решение сложно найти интуитивно
  138.         //возможно потребуется дополнительный поиск информации
  139.         //см. период Пизано
  140.         //int period = m * 6; // каждые m * 6 раз или меньше остатки m чисел будут повторяться
  141.         BigInteger numberFib;
  142.         BigInteger prev = BigInteger.ONE;
  143.         BigInteger prevprev = BigInteger.ZERO;
  144.         BigInteger bigPeriod = BigInteger.valueOf(m); // m в BigInteger
  145.         long worsePeriod = n %  (m * 6L);
  146.         int [] arrOfReminder = new int[(int) worsePeriod + 1];
  147.         int i = 2;
  148.         arrOfReminder[0] = 0;
  149.         arrOfReminder[1] = 1;
  150.         while (i <= worsePeriod) {
  151.             numberFib = prev.add(prevprev);
  152.             prevprev = prev;
  153.             prev = numberFib;
  154.             arrOfReminder[i] = (numberFib.mod(bigPeriod)).intValue(); // массив остатков
  155.             i++;
  156.         }
  157.         int[] finalArray = new int[(int) worsePeriod + 1];
  158.         i = 0;
  159.         for (int j = 1; j < arrOfReminder.length - 2; j++) {
  160.             if (arrOfReminder[0] == arrOfReminder[j]) {
  161.                 if (arrOfReminder[1] == arrOfReminder[j + 1]) {
  162.                     if (arrOfReminder[2] == arrOfReminder[j + 2]) {
  163.                         while (i != j) {
  164.                             finalArray[i] = arrOfReminder[i];
  165.                             i++;
  166.                         }
  167.                         break;
  168.                     }
  169.                 }
  170.             }
  171.         }
  172.         int reminder = 0;
  173.  
  174.         if (n == 1)
  175.             return 1;
  176.         if (n ==2)
  177.             return 2;
  178.         if (n < m)
  179.             reminder = (int)n;
  180.         else
  181.             reminder = (int) n % i; // оно должно работать всегда, когда i != 0
  182.         return finalArray[reminder];
  183.     }
  184.  
  185.  
  186. }
  187.  
  188.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement