2016-10-01 12 views
-2

質問:フィボナッチシーケンスの新しい各項は、前の2つの項を追加することによって生成されます。 1及び2から出発して、最初の10の用語は次のようになりますプロジェクトオイラー#2;コードが正解を出力できない

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

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

誰かが私のコードで論理エラーを理解するのに手伝ってもらえるかもしれませんが、私は正しいと思っても正解を報告しません。ありがとう!それが問題文19544084.

long val1 = 1, val2 = 1, valEven = 2, total = 0; 
while (val2 < 4000000 && val1<4000000) { 
    total += valEven; //only add even numbers to total 
    val1 += val2 + valEven; 
    val2 += val1 + valEven; 
    valEven += val1 + val2; 
} 

System.out.println(total); 
+0

これでは問題を診断するには不十分です。あなたは、期待される(正しい)答えと実際に得られる答えを提示しなければなりません。質問を編集して追加してください。 –

+0

問題に詳しい説明を追加する必要があります。オイラー問題2の問題文を貼り付けてください。 –

答えて

1

なければならないときに出力が500693である(hereから)である。

フィボナッチ数列の各新しい用語が 前の二つの用語を追加することによって生成されます。 1及び2から出発して、最初の10件の用語は あろう:

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

用語を考慮することによって値が を超えていないフィボナッチシーケンスでは、偶数の項の和を求めます。

あなたは何をすべき:それら400万

  • トラバースより

    • 一覧フィボナッチ数より少ないと

  • あなたは間違って何をしているそのリストから偶数の合計を計算:

    • フィボナックCI番号が間違っているあなたも、数字をチェックされていない

    あなたは、あなたが順番に3つの数字を取得し、その後に第三追加する必要があり、「フィボナッチ内のすべての3番目の数字が偶数である」という事実を使用したい場合あなたの合計。私はあなたがオペレータ+=を間違って使用していると思います。

    a += b; 
    

    は、このコードがどうあるべきかである

    a = a + b; 
    

    意味:

    long val1 = 1, val2 = 1, valEven = 2, total = 0; 
        while (val2 < 4000000 && val1 < 4000000) { 
         total += valEven; // only add even numbers to total 
         val1 = val2 + valEven; 
         val2 = val1 + valEven; 
         valEven = val1 + val2; 
        } 
    
        System.out.println(total); 
    

    答えは:4613732

    +0

    フィードバックをいただきありがとうございます。フィボナッチ配列では、3項ごとに1つの偶数が存在する。フィボナッチ数の論理が間違っていて、偶数をチェックする方法を説明してもらえますか? – tsalemy

    +0

    @tsalemyフィボナッチの3番目の数字がすべて偶数であるという事実を利用したい場合は、順番に3つの数字を取得し、次に合計を3つ追加する必要があります。私は+ =間違った演算子を使用していると思います。答えの更新を参照してください –

    +0

    はい、私は理解していない重要な論理エラーだった意味がたくさんある。非常に有用な答え。 – tsalemy

    1

    これは、デバッグに関する一般的な答えです。

    コードにprintlnステートメントを追加して、中間結果を確認しました。

    実行可能コードは次のとおりです。

    public class FibonacciTest { 
    
        public static void main(String[] args) { 
         long val1 = 1, val2 = 1, valEven = 2, total = 0; 
         while (val2 < 4000000 && val1 < 4000000) { 
          total += valEven; // only add even numbers to total 
          val1 += val2 + valEven; 
          val2 += val1 + valEven; 
          valEven += val1 + val2; 
          if (val1 < 1000L) 
           System.out.println(val1 + " " + val2 + " " + valEven); 
         } 
    
         System.out.println(total); 
        } 
    
    } 
    

    結果は以下のとおりです。

    4 7 13 
    24 44 81 
    149 274 504 
    927 1705 3136 
    5600910 
    

    ご覧のとおり、フィボナッチシーケンスは正しく計算されていないため、偶数の合計を適切に計算していません。

    まず、フィボナッチシーケンスを修正しましょう。フィボナッチシーケンスを正しく計算するには3つの値が必要です。長い定数に "L"を追加しましょう。

    public class FibonacciTest { 
    
        public static void main(String[] args) { 
         long val1 = 1, val2 = 2, val3 = 2, total = 0; 
         while (val1 < 4_000_000L) { 
          if (val1 < 1000L) { 
           System.out.println(val1 + " " + val2 + " " + val3); 
          } 
    
          val3 = val1 + val2; 
          val1 = val2; 
          val2 = val3; 
         } 
    
         System.out.println(total); 
        } 
    
    } 
    

    ここには最初のいくつかの結果があります。

    1 2 2 
    2 3 3 
    3 5 5 
    5 8 8 
    8 13 13 
    13 21 21 
    21 34 34 
    34 55 55 
    55 89 89 
    89 144 144 
    

    フィボナッチシーケンスが正しく生成されたので、偶数値を加算しましょう。

    public class FibonacciTest { 
    
        public static void main(String[] args) { 
         long val1 = 1L, val2 = 2L, val3 = 2L, total = 0L; 
         while (val1 < 4_000_000L) { 
          val3 = val1 + val2; 
          val1 = val2; 
          val2 = val3; 
    
          if (val1 % 2L == 0L) { 
           System.out.println(val1); 
           total += val1; 
          } 
         } 
    
         System.out.println(total); 
        } 
    
    } 
    

    ここに結果があります。

    2 
    8 
    34 
    144 
    610 
    2584 
    10946 
    46368 
    196418 
    832040 
    3524578 
    4613732 
    

    合計は4613732です。

    +0

    ありがとうございました。とても役に立ちました。 – tsalemy

    0

    あなたは

    int valOdd1 = 1, valOdd2 = 1, valEven = 2; 
    long total = 0; 
    while (valEven <= 4000000) { 
        total += valEven; //only add even numbers to total 
        valOdd1 = valOdd2 + valEven; 
        valOdd2 = valEven + valOdd1; 
        valEven = valOdd1 + valOdd2; 
    } 
    

    と書き出さ(理由は股関節の追加の)...、フィボナッチ数列に番号が奇数 - 奇数 - 偶数であることを巧妙な事実を使用して、奇数奇数 - 偶数ました。

    valOdd1' = valOdd2 + valEven; 
        valOdd2' = valEven + valOdd1'; 
        valEven' = valOdd1' + valOdd2'; 
    
        valOdd2' = 2*valEven + valOdd2; 
        valEven' = 3*valEven + 2*valOdd2; 
    
    int valOdd2 = 1, valEven = 2; 
    long total = 0; 
    while (valEven <= 4000000) { 
        total += valEven; //only add even numbers to total 
        int nextValOdd2 = 2*valEven + valOdd2; 
        valEven = 3*valEven + 2*valOdd2; 
        valOdd2 = nextValOdd2; 
    } 
    

    エラーが条件であった、(1)「を超えない」<=を意味し、(2)valEvenは、各ループのステップで最終結果として試験されなければなりません。 また、(3)+=は単に=にする必要があります。はるかに小さい間違った結果は、シーケンスをはるかに大きなステップでステップするという効果でした。

    +0

    ありがとうございました – tsalemy

    関連する問題