Advertisement
THOMAS_SHELBY_18

Untitled

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