Advertisement
Vladislav8653

Untitled

Mar 2nd, 2023
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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.  
  59.  
  60. package by.it.a_khmelev.lesson01;
  61.  
  62. import java.math.BigInteger;
  63.  
  64. /*
  65. * Вам необходимо выполнить способ вычисления чисел Фибоначчи с вспомогательным массивом
  66. * без ограничений на размер результата (BigInteger)
  67. */
  68.  
  69. public class FiboB {
  70.  
  71. private long startTime = System.currentTimeMillis();
  72.  
  73. private long time() {
  74. return System.currentTimeMillis() - startTime;
  75. }
  76.  
  77. public static void main(String[] args) {
  78.  
  79. //вычисление чисел простым быстрым методом
  80. FiboB fibo = new FiboB();
  81. int n = 55555;
  82. System.out.printf("fastB(%d)=%d \n\t time=%d \n\n", n, fibo.fastB(n), fibo.time());
  83. }
  84.  
  85. BigInteger fastB(Integer n) {
  86. BigInteger result = BigInteger.ZERO;
  87. BigInteger prev = BigInteger.ONE;
  88. BigInteger prevprev = BigInteger.ZERO;
  89. int i = 2;
  90. while (i <= n) {
  91. result = prev.add(prevprev);
  92. prevprev = prev;
  93. prev = result;
  94. i++;
  95. }
  96. return result;
  97. }
  98. }
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112. package by.it.a_khmelev.lesson01;
  113.  
  114. /*
  115. * Даны целые числа 1<=n<=1E18 и 2<=m<=1E5,
  116. * необходимо найти остаток от деления n-го числа Фибоначчи на m.
  117. * время расчета должно быть не более 2 секунд
  118. */
  119.  
  120. import java.math.BigInteger;
  121.  
  122. public class FiboC {
  123.  
  124. private long startTime = System.currentTimeMillis();
  125.  
  126. private long time() {
  127. return System.currentTimeMillis() - startTime;
  128. }
  129.  
  130. public static void main(String[] args) {
  131. FiboC fibo = new FiboC();
  132. int n = 18;
  133. int m = 4;
  134. System.out.printf("fasterC(%d)=%d \n\t time=%d \n\n", n, fibo.fasterC(n, m), fibo.time());
  135. }
  136.  
  137. long fasterC(long n, int m) {
  138. //Решение сложно найти интуитивно
  139. //возможно потребуется дополнительный поиск информации
  140. //см. период Пизано
  141. //int period = m * 6; // каждые m * 6 раз или меньше остатки m чисел будут повторяться
  142. BigInteger numberFib;
  143. BigInteger prev = BigInteger.ONE;
  144. BigInteger prevprev = BigInteger.ZERO;
  145. BigInteger bigPeriod = BigInteger.valueOf(m); // m в BigInteger
  146. long worsePeriod = n % (m * 6L);
  147. int [] arrOfReminder = new int[(int) worsePeriod + 1];
  148. int i = 2;
  149. arrOfReminder[0] = 0;
  150. arrOfReminder[1] = 1;
  151. while (i <= worsePeriod) {
  152. numberFib = prev.add(prevprev);
  153. prevprev = prev;
  154. prev = numberFib;
  155. arrOfReminder[i] = (numberFib.mod(bigPeriod)).intValue(); // массив остатков
  156. i++;
  157. }
  158. int[] finalArray = new int[(int) worsePeriod + 1];
  159. i = 0;
  160. for (int j = 1; j < arrOfReminder.length - 2; j++) {
  161. if (arrOfReminder[0] == arrOfReminder[j]) {
  162. if (arrOfReminder[1] == arrOfReminder[j + 1]) {
  163. if (arrOfReminder[2] == arrOfReminder[j + 2]) {
  164. while (i != j) {
  165. finalArray[i] = arrOfReminder[i];
  166. i++;
  167. }
  168. break;
  169. }
  170. }
  171. }
  172. }
  173. int reminder = 0;
  174.  
  175. if (n == 1)
  176. return 1;
  177. if (n ==2)
  178. return 2;
  179. if (n < m)
  180. reminder = (int)n;
  181. else
  182. reminder = (int) n % i; // оно должно работать всегда, когда i != 0
  183. return finalArray[reminder];
  184. }
  185.  
  186.  
  187. }
  188.  
  189.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement