2016-11-28 6 views
0

フィボナッチシーケンスの新しい各項は、前の2つの項を追加することによって生成されます。 1及び2から出発して、最初の10の用語は次のようになりますC++ Project Euler#2を正しく取得できない

1、2、3、5、8、13、21、34、55、89、...

の観点を考慮してその値が400万を超えないフィボナッチ配列は、偶数の項の和を求める。

私はこれをquestionとも言いましたが、私の場合はあまり役に立ちませんでした。

私は10これまでのシーケンスを制限したときに、私も大切項の和を得ましたが、私のコードです:

#include <iostream> 
using namespace std; 
int main() 
{ 
int x = 0, y = 1, z, sumeven = 0; 

for (int stop=1; stop <= 5; stop++) 
{ 
    z = x + y; 
    x = y; 
    y = z; 
    cout << y << endl; 

    if (y % 2 == 0) 
    { 
     sumeven += y; 
    } 
} 
cout << "The total is: "<< sumeven << endl; 
return 0; 
} 

これは、上記のコードに私の出力です:

1 
2 
3 
5 
8 
The total is: 10 
Program ended with exit code: 0 

4,000,000の値を入力すると問題が発生します。これがコードです。唯一の違いは、シーケンスを印刷しなかったことです。

#include <iostream> 
using namespace std; 
int main() 
{ 
int x = 0, y = 1, z, sumeven = 0; 

for (int stop=1; stop <= 4000000; stop++) 
{ 
    z = x + y; 
    x = y; 
    y = z; 

    if (y % 2 == 0) 
    { 
     sumeven += y; 
    } 
} 
cout << "The total is: "<< sumeven << endl; 
return 0; 
} 

これは上記のコードへの出力です。

The total is: -1833689714 
Program ended with exit code: 0 

私のコードは完全に小さいシーケンスでは動作するように見えますが、コードが正確に同じであれば4百万個では入力できません。

コンピュータサイエンスの高速履修のために、Intro to Programmingブリッジングクラスをuniで始めました。彼らは2週間の週にレッスンの学期の授業を詰め込んでいます。その終わりまでにC++の基礎を理解したいので、どんな助けでも大歓迎です。ありがとう!

+0

あなたはオーバーフローしていますg 'int'データ型。おそらく最大値が '2^31-1'です。これを避けるには、 'unsigned long long'として' sumeven'を再定義してみてください。 – lcs

答えて

0

あなたは問題を間違って解釈しました。問題は4.000.000

より低い要素を要求しながら、あなただけの変更フィボナッチ数列の4.000.000th要素までをチェックしている

for (int stop=1; stop <= 4000000; stop++) 

while(y < 4000000) 

編集

へ: なぜ数値が負であったのかわからない場合は、整数オーバーフローのケースです: https://en.wikipedia.org/wiki/Integer_overflow

+0

私はただ問題を読んで、実現しました。それは午前5時です。私は何時間も苦しんでいるような気がします。整数のオーバーフローを知ることは非常に便利です。ありがとうございました。 – Eleventy7

+0

心配する必要はなく、すべてのプログラマーはこの種の小さな問題に一度悩まされます:)。 Btw、あなたはそれが好きなら、答えをupvoteすることができます。 –

+0

あなたは正当に私のupvoteに値するが、残念ながら私はそれが公に表示されるのに十分な評判がない。私は申し訳ありません:( – Eleventy7

関連する問題