|
20鱼币
带你学C带你飞第一阶段考核里有个题目,找出斐波那契数列中数值不超过 4 百万的项,并计算这些项中值为偶数的项之和。标准答案是这样。
#include <stdio.h>
int main()
{
long a = 1, b = 2, c, sum = 0;
do
{
if (!(b % 2))
{
sum += b;
}
c = a + b;
a = b;
b = c;
} while (c < 4000000);
printf("%ld\n", sum);
return 0;
} 运行结果为4613732
但是我把c去掉,把代码改成:
#include <stdio.h>
int main()
{
long a = 1, b = 2, sum = 0;
do
{
if (!(b % 2))
{
sum += b;
}
a = b;
b = a+b;
} while (a+b< 4000000);
printf("%ld\n", sum);
return 0;
} 运行结果变成了4194302. 这是咋回事?
本帖最后由 jackz007 于 2018-9-15 14:01 编辑
楼主的程序问题出在以下语句:
a = b ;
b = a + b ;
变量 a 在这里完全失去了独立性,成为 b 的映射,根本就没必要存在,上述 2 条语句完全可以用下面的 1 条语句等效:
b = b * 2 ;
按定义, “斐波那契数列” 是从 1 ,2 开始,后面的项是前两项之和:1 ,2 ,3 ,5 ,8 ,13 ,21 ......(标准答案代码中的变量 c)
而按楼主程序的表述则是从 2 开始,后面的项是前一项的两倍:2 ,4 ,8 ,16 ,32 ,64 ...... (楼主代码中的 a + b)
“斐波那契数列”不正确,这就是楼主的问题之所在,所以,标准答案代码中的变量 c 是万万不可省略的。
|
最佳答案
查看完整内容
楼主的程序问题出在以下语句:
a = b ;
b = a + b ;
变量 a 在这里完全失去了独立性,成为 b 的映射,根本就没必要存在,上述 2 条语句完全可以用下面的 1 条语句等效:
b = b * 2 ;
按定义, “斐波那契数列” 是从 1 ,2 开始,后面的项是前两项之和:1 ,2 ,3 ,5 ,8 ,13 ,21 ......(标准答案代码中的变量 c)
而按楼主程序的表述则是从 2 开始,后面的项是前一项的 ...
|