今天我正在解决一个问题:
斐波那契数列中的每个新术语都是通过将前两个术语相加而生成的。从1和2开始,前10个术语将是:
1、2、3、5、8、13、21、34、55、89,...
通过考虑斐波那契数列中值不超过400万的项,找到偶值项的总和。
这是Euler项目上的问题,这里是链接:
https://projecteuler.net/problem=2
我不知道我的代码有什么问题。我认为我的逻辑是正确的,但我仍然得到错误的答案。 我已经测试了n <100,n <500,n <2000,并且得到了正确的答案,所以我认为当n <4000000时,此代码将是正确的。
这是我的代码
#include <stdio.h>
long long int Fib(int n){
if (n == 1){
return 1;
}
else if (n == 2){
return 2;
}
else {
return (Fib(n - 1) + Fib(n - 2));
}
}
int main()
{
int i;
long long int sum=0;
for(i=2;Fib(i)<4000000;i=i+2){
sum+= Fib(i);
}
printf("%lld",sum);
return 0;
}
当n <4000000时,我的答案是5702886
答案 0 :(得分:0)
首先,在您的问题中,您说“其值不超过400万”,因为4M不超过4M,因此应为“ <= 4M”。 但是我不认为这是您的错误,最大的错误是在main函数中,对于for,您实际上要以“ i = i + 2”为步长,而实际上要对斐波那契数列。元素列表中没有偶数索引。
解决方案: 此处的简单解决方案(效率很低)是将for的步骤更改为“ i ++”,并在其中进行if操作:
if(Fib(i) % 2 == 0)
sum += Fib(i);
额外: 如果要修复代码以提高效率,可以做一些事情。如果您在调用fib(i + x)时注意到,您将再次计算之前已经完成的几次迭代。通过有一个向量可以轻松地解决此问题,该向量可以保存斐波那契序列的每个元素,然后最后将偶数相加。
编辑: 这是替代(更有效)解决方案的示例: 谨慎使用:未经测试可能会有小错误。
int main(){
int fibbs[4000000]; // it will never be bigger than this
int sum = 0;
int numValues = 0; // counts the number of values in the vector
// initialize vector to 0's , probably not necessary
for(i = 0; i < 4000000; i++){
fibs[i] = 0;
}
// first positions of fibonacci
fibs[0] = 1;
fibs[1] = 1;
fibs[2] = 2;
// fill the vector with all the fibonacci numbers until 4M
int i = 3;
while(1){
fibs[i] = fibs[i-1] + fibs[i-2];
if(fibs[i] > 4000000){
fibs[i] = 0; // it is already bigger than 4M , can't sum this one
numValues = i-1; // save the number of values in the vector
break;
}
i++;
}
for(i = 0; i <= numValues; i++){
if(fibs[i] % 2 == 0 ){
sum += fibs[i];
}
}
printf("Sum is: %d\n", sum);
return 0;
}
答案 1 :(得分:0)
我确实知道我的错误在哪里。该问题想要Fib(i)%2 == 0的总和,但是我的代码试图找出2th 4th 6th的总和...我对这个问题做出了错误的误解。