【发布时间】:2020-05-24 14:37:50
【问题描述】:
我正在尝试实现一个迭代算法来计算第 N 个斐波那契数的最后 5 位数字。我找到第 n 个斐波那契数本身并只显示最后 5 位数字没有问题,但是,我的作业还要求找到我的程序在 1 分钟内运行的最大值 n。问题是,N 变得非常大,因此斐波那契数也很大。我应该只使用 BigInteger 来存储值并最终使用 % 运算符来显示最后 5 个数字吗?有没有办法利用我只需要最后 5 位数字来加速这个过程?我觉得我错过了任务的重点。
作业是这样说的: 使用 Java,实现计算第 n 个斐波那契数的最后 5 位的迭代算法。进行实验,找出程序在计算机上运行时间不到 1 分钟的最大 n 值。
我查找第 N 个斐波那契数的最后 5 位的代码:
public static int Fibonacci(int n){
int a, b = 0, c = 1;
for(int i = 1; i < n; i++){
a = b;
b = c;
c = a + b;
}
return c % 100000;
}
我也很想知道是否有更好的迭代解决方案。
【问题讨论】:
-
你可以使用
int,因为中间结果只需要模100,000计算。但是你需要在循环中做余数运算。 -
谢谢!但是这里的数学是如何工作的呢?我正在考虑这个解决方案,但由于某种原因没有尝试过,因为我真的不相信它会起作用。
-
和的后 5 位仅取决于每个被加数的后 5 位,因为进位仅从右到左进行(左位没有机会影响自己右侧的数字) .
-
如果执行时间很重要,那么如果不是绝对必要的话,永远不要使用
BigInteger或BigDecimal,因为与原语甚至包装器相比,这些类非常慢。 -
数学运算:两个数相加时,和的后5位只能受后5位的影响。所以代码只需要保留
c的后5位即可。这意味着您不需要模运算符。a和b中你应该有的最大数字是99999。当你计算c时,它会在00000到199998之间。这意味着在计算c之后,你可以用@将其修剪为5位数987654330@
标签: java algorithm iteration fibonacci