柯毅哲 发表于 2018-9-15 10:34:23

帮忙看下一个小细节

带你学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 10:34:24

本帖最后由 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 是万万不可省略的。

柯毅哲 发表于 2018-9-15 14:13:10

jackz007 发表于 2018-9-15 10:34
楼主的程序问题出在以下语句:

    a = b      ;


哇塞,感谢大佬的细心指导。{:10_256:}
页: [1]
查看完整版本: 帮忙看下一个小细节