[英]What is wrong with this algorithm?
我试图解决Euler项目问题2 : 找到斐波那契数列的偶数项之和,最高为4,000,000。 例如:最多1000,总和为2 + 8 + 34 + 144 + 610 = 798。
现在,我的算法是从2开始将每个第三个斐波那契数字相加-因为每个第三个斐波那契数字必然遵循逻辑:
偶数:E,奇数:O,
O+E=O E+O=O O+O=E
1+2=3 2+3=5 5+3=8 (example)
因此,我编写了以下代码来找出答案。
#include<stdio.h>
#define LT 4000000
int main()
{
double i0,i1,sum=0,cycle,eSum=2,status=1;
i0 = 1;
i1 = 2;
while(i1<LT && status == 1)
{
for(cycle=3;cycle>0;cycle--)
{
sum=i0+i1;
i0=i1;
i1=sum;
if((i1+i0)>LT)
{
status = 0;
break;
}
}
eSum+=(status == 1)?sum:0;
}
printf("\nThe required Answer: %8.0f\n",eSum);
return 0;
}
现在,它对于LT = 1000可以正常工作 ,但是对于需要LT = 4,000,000的问题,程序显示错误的值1089154而不是正确的值4613732 。
我不知道这段代码出了什么问题。 另外,我不了解它在LT = 1000时如何正常工作,但在更大的数量下却无法正常工作。我错过了令人尴尬的显而易见的东西吗? 请帮忙..
OP退出循环的时间过早。 将test更改为sum
而不是下一个 sum
i1+i0
。
for(cycle=3;cycle>0;cycle--) {
sum=i0+i1;
i0=i1;
i1=sum;
// if((i1+i0)>LT)
if(sum>LT)
{
status = 0;
break;
}
}
由于您的数字在[1 ... 2 * 4,000,000]范围内,因此使用long
, unsigned long
, float
, double
会得到可接受的结果。 由于这是整数问题,建议使用整数。
内部函数看起来有点儿混乱,您不应该对自然数使用double。 尝试这样的底部:
#include<stdio.h>
#define LT 4000000
int main()
{
long i0,i1,sum=0,eSum=2;
int counter = 0;
i0 = 1;
i1 = 1;
while(sum<LT)
{
sum=i0+i1;
i0=i1;
i1=sum;
eSum+=((counter++ % 3 == 0) && ( sum <= LT))?sum:0;
}
printf("\nThe required Answer: %8.0f\n",eSum);
return 0;
}
为什么不简单地这样呢?
#include <stdio.h>
#include <inttypes.h>
#define LT 4000000
typedef uint64_t Numtype;
int main( void )
{
Numtype n0 = 1;
Numtype n1 = 1;
Numtype n2 = 0;
Numtype sum = 0;
for(;;)
{
n2 = n0 + n1;
if ( n2 > LT ) break;
if ( n2 % 2 == 0 ) sum += n2;
n0 = n1;
n1 = n2;
}
printf("\nThe required Answer: %ld\n", sum);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.