【发布时间】:2019-09-09 15:39:11
【问题描述】:
我对找到从索引 m 到索引 n 的斐波那契数列项和的最后一位存有疑问(考虑起始项的索引为 0)。
我有很多不同的方法来解决这个问题。但是对于 ex m=2,n=82364572389 等,也需要通过很长的案例。但是当我尝试使用此算法时,我的一些测试用例通过了,但有些没有。
你能帮我看看我的代码有什么问题还是这个算法有问题。
还有如何用更好的方法解决这个问题。
#include <iostream>
using namespace std;
long long calc_fib(long long n) {
n = (n+2)%60;
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];
}
// cout<<fib[n]<<"\n";
if(fib[n] == 0){
return 9;
}
return (fib[n]%10-1);
}
int main() {
long long n = 0,m;
std::cin >> m;
std::cin >> n;
std::cout << calc_fib(n)-calc_fib(m-1) << '\n';
return 0;
}
测试用例
Test Case: 5 10
Correct Output: 6
My Output: -4
Test Case: 1 10000000
Correct Output: 5
My Output: 5
【问题讨论】:
-
int fib[n+1];不是有效的 C++。 -
int fib[n+1];是undefined behavior。 -
当您说总和的最后一位时,您的意思是按小数点 n 的近似值,或者按字面意思将每个数字相加?
-
您正在计算第 n 个数字的最后一位数字与 m-1:st 数字的最后一位数字之间的差异。这不是问题所在。
-
解决这个问题的有趣方法是尝试从标准summation formula 推导多项式函数,方法是通过黄金比例的步进函数和反向步进偏差。请记住,斐波那契数列是黄金均值的理想化——因此需要实现一些整数魔法,而斐波那契数列在很大程度上取决于它的基数。 `Fib(3, item=4) != Fib(6, item =4)