我一直在尝试找到一个解决方案来解决寻找大 n 斐波那契数列之和的最后一位数字的问题。我已经能够通过几个大 n 的测试用例。但我被困在以下情况,其中 n = 832564823476。我知道它可以使用 Pisano 的时期来解决,但我无法提出一个有效的算法。任何帮助都会很棒。谢谢。我实现的代码如下 -
#include <iostream>
using namespace std;
int calc_fib(int n) {
int fib[n+1];
fib[0]=0;
fib[1]=1;
int res = 1;
for(int i = 2; i<=n;i++){
fib[i] = (fib[i-1]%10 + fib[i-2]%10)%10;
res = res + fib[i];
}
return (res%10);
}
int main() {
int n = 0;
std::cin >> n;
std::cout << calc_fib(n) << '\n';
return 0;
}
原文由 codeyourstack 发布,翻译遵循 CC BY-SA 4.0 许可协议
解决了
适用于所有输入范围。它适用于以下算法。这个想法是要注意斐波那契数的最后一位数字也出现在长度为 60 的序列中(来自上一个问题:因为 10 的 pisano peiod 是 60)。不管 n 有多大,它的最后一位数字都将出现在序列中的某个位置。除了最后一位数字 10 的边缘情况外,还有两件事。
代码如下;