2016-10-14 15 views
0

プロジェクトオイラーのCで問題2を解決しようとしました。これは私の頭に浮かんだ最初の解決策であり、実際に正しい答えを出力します。問題は、私がプログラムを走らせるたびに、私には正しい答えである "2"か "4613732"のどちらかの異なる出力が得られるということです。私の貧しい英国人のために申し訳ありません、あなたは何が間違っているかを見つけるのを助けてくれますか?プロジェクトオイラー2# - 奇妙な出力

#include <stdio.h> 
int main(){ 
    int n, n1 = 1, n2 = 2, sum = 2; 
    while(n<4000000){ 
    n = n1 + n2; /*calculate the next number of the series*/ 
    n1 = n2; 
    n2 = n; 
    if(n%2 == 0){ 
     sum = sum + n; /*if the number it's even add it to the main sum*/ 
     } 
    } 
    printf("The sum is %d\n", sum); 
} 
+2

「n」を初期化していないので、任意の値で開始できます。 '<4000000'という値で始まる場合、ループが実行され、正しい答えが得られます。値が '> = 4000000'で始まっていれば、ループは実行されず、' sum = 2'で始まったので出力は2です。これは[未定義の動作](https://stackoverflow.com/questions/4105123)として知られています。 – user3386109

答えて

2

nを初期化していません。あなたが正しい答えを得ると、それはあなたが幸運を得たことを意味します。

、より効率的なソリューションについては
+0

私は見る...それは愚かなエラー、あなたの助けに感謝していた! –

1
#include <conio.h> 
#include <iostream> 

using namespace std; 


int evenFibSum(int i=1,int j=2) 
{ 
    const int max = 3999999; 
    int eventsum = 2; 
    int sum = 0; 
    while (sum < max) 
    { 
     sum = i + j; 
     i = j; 
     j = sum; 

     if (sum % 2 == 0) 
      eventsum +=sum; 
    } 
    return eventsum; 
} 

私は、次のインデックス値を追加するために持っていてもfibbonanci追加を取得するには、論理

Fibbonaci Series => 1 2 3 5 8 13 21 34 55 89 144 
Index   => 0 1 2 3 4 5 6 7 8 9 10 

を以下の適用[1 4 7 10] ここで私はいくつかのパターン

を感知しています[1 4 7 10] =>先行指数が3で必要です。

3進法による指導方法3

// k = i+j = > 3 13 55 
// i = k+j => 5 21 89 
// j = k+i => 8 34 144 

int evenFibSumx(int i=1,int j=2) 
{ 
    const int max = 3999999; 
    int eventsum = 2; 
    int k= 0; 
    while (1) 
    { 
     k = i + j; 
     i = k + j; 
     j = k + i; 
     if(i >= max) 
      break; 
     if (j%2 == 0) 
      eventsum +=j; 
    } 
    return eventsum; 
} 


int main() 
{ 
    std::cout << evenFibSum(); 
    std::cout << evenFibSumx(); 

}