3

フィボナッチ数列の新しい各項は、前の2つの項を追加することによって生成されます。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

私が見ることができる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)

さらに考えてみると、実際には変数は必要ないと思います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 に答える