2016-03-25 14 views
1

フィボナッチ数列の正の数が400万未満のものをすべて印刷しようとしています。コードがすぐに終了するのはなぜですか?

public static void main(String[] args) { 

    int n1 = 1; 
    int n2 = 2; 
    int n3 = 0; 

    while (n3 <= 4000000) { 
     n3 = n1 + n2; 
     if (n3 % 2 == 0) { 
      System.out.println(n3); 
     } 
     n1+=1; 
     n2+=1; 
    } 
} 
+3

なぜモジュロチェックをしていますか?これはシーケンス内で偶数だけを印刷することになります。 – Makoto

+0

コードの実行中にエラーが発生しましたか?また、これはfibonacciシーケンスを印刷するためのアルゴリズムではありません。* n1 *と* n2 *はインクリメントされません。 – costrom

+3

これはフィボナッチシーケンスではありません。 –

答えて

0

問題はフィボナッチ数を計算していないことです。しかし、あなたがそうしたとしても、これは非常に速く実行する必要があります。結果を計算することはできません。

すべての偶数フィボナッチ値が必要です。フィボナッチの3分の1はそれでもありますので、それぞれをチェックする必要はありません。あなたは

int a = 1; 
int b = 1; 
int c = a + b; 
long sum = 0; 
while (c < 4_000_000) { 
    sum += c; 
    a = b + c; 
    b = a + c; 
    c = a + b; // skip forward to the next even fibonacci 
} 

注を行うことができます。このドロップ高価であり、ループの1 /第3回を持ってい%を。

6

ロジックが間違っています。

あなたはn3であることがわかりますデバッガでこのコードをステップ実行した場合、決してでも(何をn3 % 2 == 0にするためにテストしている)ので、if条件が真なることはありません。

最新のプロセッサが400万(数十ミリ秒以下)になるまで時間がかかりませんので、すぐにプログラムが終了するようです。

3

コードはすぐに終了せず、何も印刷されません。 n1は1として開始し、n2は2として合計3を与えます。これは奇数であり印刷されません。ループの各反復は、両方の数値をインクリメントし、別の奇妙な結果をもたらし、再び何も印刷しません。

フィボナッチ数は、しかし、偶数番号とは何の関係もない - 彼らは、直列の2つの前の数字だけの合計です:

while (n3 <= 4000000) { 
    n3 = n1 + n2; 
    System.out.println(n3); 
    n1 = n2; 
    n2 = n3; 
} 
2

まず、あなたがで正しくn1n2を確立していませんループの終わり。 n1n2のそれぞれに1を追加しないでください。 n1n2のそれぞれを増分しているだけなので、そのうちの1つは奇数であり、そのうちの1つは常に偶数であるためです。これはn3を奇妙にするので、決して印刷されません。代わりにn1n2に設定し、次にn2n3と設定します。

第2に、フィボナッチ配列のすべての数が正であるため、印刷物に条件を付ける理由はありません。とにかく、その条件は偶数のものだけを印刷します。プリントを残してifを取り外します。

0

コードがすぐに終了するのはなぜですか?(ロジックのために行くされません)

条件if (n3 % 2 == 0)は常に偽であるとして、あなたのコードは何も印刷されていないので(n3が常に奇数である)、条件ならばインクルードを削除し、それを印刷するので、すぐにを終了しません。時間がかかる

関連する問題