1

プロジェクト オイラーの問題 #2を解決しようとしていました: 4,000,000 までのフィボナッチ数列の偶数項の合計を見つけます。例 : 1000 まで、合計は 2+8+34+144+610 = 798 です。

ここで、私のアルゴは、2 以降のフィボナッチ数を 3 つおきに加算することでした。これは、3 つおきのフィボナッチ数がロジックに従って偶数になることがバインドされているためです。

偶数:E、奇数:O、

O+E=O    E+O=O    O+O=E
1+2=3    2+3=5    5+3=8    (example)

だから、私は答えを理解するために次のコードを書きました..

#include<stdio.h>
#define LT 4000000
int main()
{
    double i0,i1,sum=0,cycle,eSum=2,status=1;
    i0 = 1;
    i1 = 2;

    while(i1<LT && status == 1)
    {
        for(cycle=3;cycle>0;cycle--)
        {
            sum=i0+i1;
            i0=i1;
            i1=sum;

            if((i1+i0)>LT)
            {
                status = 0;
                break;
            }
        }
        eSum+=(status == 1)?sum:0;
    }
    printf("\nThe required Answer: %8.0f\n",eSum);
    return 0;
}

現在、LT = 1000では正しく動作しますが、LT=4,000,000 が必要な問題では、プログラムは正しい値4613732ではなく、間違った値1089154を表示します。

このコードの何が問題なのかわかりません。また、LT=1000 では正しく機能するのかわかりませんが、それ以上の数では機能しません。恥ずかしいほど明白なものがありませんか? 助けてください..

4

3 に答える 3

0

The inner for looks kind of strnage, and you shouldn't use double for natural numbers. Try solething like this:

#include<stdio.h>
#define LT 4000000
int main()
{
  long i0,i1,sum=0,eSum=2;
  int counter = 0;
  i0 = 1;
  i1 = 1;

  while(sum<LT)
  {
    sum=i0+i1;
    i0=i1;
    i1=sum;

    eSum+=((counter++ % 3 == 0) && ( sum <= LT))?sum:0;
  }
  printf("\nThe required Answer: %8.0f\n",eSum);
  return 0;
}
于 2013-09-13T20:05:52.263 に答える