帮忙看下一个小细节
带你学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 是万万不可省略的。 jackz007 发表于 2018-9-15 10:34
楼主的程序问题出在以下语句:
a = b ;
哇塞,感谢大佬的细心指导。{:10_256:}
页:
[1]