我对找到从索引m到索引n的斐波那契数列之和的最后一位数字感到怀疑(考虑起始项的索引为0)。
我有很多解决问题的方法。但是,对于ex m = 2,n = 82364572389等,也需要传递非常长的案例。但是当我尝试使用该算法时,我的一些测试用例通过了,但有些没有通过。
S,您可以帮我解决我的代码中是否存在任何问题或此算法是否错误。
还有如何使用更好的方法来解决此问题。
#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
答案 0 :(得分:0)
您需要更改算法。
第一件事:不要递归计算值。就运行时间而言,这是非常昂贵的。从f(0)开始,然后从f(1)开始,然后使用最后两个存储的值计算f(2)。继续这样。仅存储最后两个值。
第二:意识到完全存储f(n)是没有意义的。您可以只保留 units 和 tens (不需要十进制,但有助于调试)。看起来像: 1,1,2,3,5,8,13,21,34,55,89,44,33
请注意,89 + 44给出133,以33结尾,就像89 + 144给出233,也以33结尾。
一旦将两者结合起来,就需要一个循环,其中一个计数器为82364572389,并执行简单的加法/模运算。它应该在几分钟之内结束。
从那里开始,您可以开始考虑进一步的优化(有)。但是上面的两个应该足够了。
此外,通过评论,并重新阅读问题:
calc_fib(n) - calc_fib(m-1)
是错误的,因为它可能产生负数。而最后一位必须为正数。您可能需要采用这种差异 diff 并执行以下操作:
diff = (diff + 10) % 10;
使其正面。
最后,为什么是9?为什么在return (fib[n]%10-1);
中为-1?这似乎使所有内容都偏移了一个,但是减法中的-1都抵消了。
答案 1 :(得分:0)
继续将和移到for
循环内,如下所示:
#include <iostream>
using namespace std;
int main() {
unsigned int i, j, n, v, sum;
cout << "Fibonacci numbers from 1 to 10000: " << endl;
cout << '1' << endl;
cout << '1' << endl;
cout << '2' << endl;
for (i = j = v = 1, n = 2, sum = 4; n + j < 10000; sum += v) {
v = n + j; i = j; j = n; n = v;
cout << v << endl;
}
cout << "Sum of Fibonacci numbers from 1 to 10000: " << sum << endl;
return 0;
}
添加到测试代码[http://codepad.org/8CHIepXe]的链接