3

斐波那契数列中的每个新项都是通过添加前两项来生成的。从 1 和 2 开始,前 10 个术语将是:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 我做了程序,但我的答案不匹配。

#include<stdio.h>
int main()
{
 long unsigned int i,sum=0,x=1,y=2,num;
 for(i=0;i<4000000;i++)
 {
  num=x+y;
  if(i%2==0)
   sum+=num;
  x=y;
  y=num;
 }
 printf("%lu\n",sum);
 getchar();
 return 0;
}
4

5 回答 5

3

我可以看到三个问题:

  • 你应该从 开始x = 1, y = 1,否则你会跳过第一个偶数斐波那契;
  • 你的循环条件应该是(x + y) <= 4000000
  • 您应该测试num均匀性,而不是i.

(在这些更改之后,很明显您可以i完全省略,因此将for循环替换为while循环)

于 2010-10-03T00:09:16.270 回答
1

在您的代码中,您会找到具有偶数索引的斐波那契数的总和,而不是偶数本身+您按顺序搜索前 4000000 个数字,而不是值 <= 4000000 的数字。您的代码应该类似于

while ( y < 4000000){
...
if (y %2 == 0)
    sum += y;
} 
于 2010-10-03T00:07:12.460 回答
0

我做了一些最小的更正,现在得到了正确的答案。你可以通过阅读这篇文章(毕竟,它是你的,一开始是你的)而不是我漫无目的地谈论它来了解更多......

#include <stdio.h>

#define LIMIT (4 * 1000 * 1000)

int main() {
  long unsigned int sum = 0, x = 1, y = 2, num;

  while (x <= LIMIT) {
    if ((x & 1) == 0 && x <= LIMIT)
      sum += x;
    num = x + y;
    x = y;
    y = num;
  }
  printf("%lu\n", sum);
  return 0;
}
于 2010-10-03T00:15:06.133 回答
-1

我认为以下行

if(i%2==0)

可能反而是

if( num % 2 == 0)

进一步思考,我认为您实际上并不需要 variable i。相反,您的循环可以由 num 控制为:

enum { LIMIT = 4 * 1000 * 1000 };
num = x + y;
while( num <= LIMIT ) {
于 2010-10-03T00:10:59.367 回答
-1

在循环内打印 num,用于调试

 for(i=0;i<4000000;i++)
 {
  num=x+y;
  printf("num is %lu\n", num); /* DEBUGGING */
  if(i%2==0)
   sum+=num;
  x=y;
  y=num;
 }
于 2010-10-03T00:16:24.193 回答