2017-06-23 15 views
-4

フィボナッチのすべての偶数の合計を4ミル以下にしようとしています。 これまでのコードです。それは私に数字を示していますが、オイラーのプロジェクトは間違っていると言っています。 誰か提案をいただけますか?プロジェクトオイラーすべての偶数の和

public static void main(String[] args) { 
    System.out.println(fibonacci()); 

} 

public static int count(){ 
    int sum = 0; 
    for(int i =0; i<1000;i++){ 
     if(i%3==0||i%5==0){ 
      sum+=i; 
     } 
    } 
    return sum; 
} 


public static long fibonacci(){ 

    ArrayList<Integer> even = new ArrayList<Integer>(); 



    int first = 1; 
    int second = 1; 
    int third = 0; 
    long sum = 0; 

    while(!(third>=3999999)){ 

     third = first+second; 
     first = second; 
     second = third; 
     if(first%2==0){ 
      even.add(new Integer(first)); 

     } 
     if(second%2==0){ 
      even.add(new Integer(second)); 

     } 
     if(third%2==0){ 
      even.add(new Integer(third)); 

     } 


    } 
    for(int i = 0; i<=even.size()-1;i++){ 

     sum+=even.get(i); 
    } 
    return sum; 

} 
+3

フィボナッチこれに関連している理由???? –

+0

あなたの質問が正確であれば、この問題はフィボナッチとは関係ありません。あなたにこのパズルを完成させるための適切なコードを与えることができますが、その種の目的を破るものです。フィボナッチとは何の関係もないことだけを知っています。 – Nieminen

+0

あなたのコードは、フィボナッチ数のいくつかのサブセットを集めているようです。私はそれがあなたが意図したものではないと確信しています。 –

答えて

1
  1. に置かれる必要があるあなたが不完全な質問を書いていると思いますが、元の問題文もフィボナッチ数列の一部であるすべての偶数の合計を見つけることです。
  2. フィボナッチシリーズのすべての番号を最初に追加し、次のチェックが偶数であることを確認して、それを次のループの新しい変数に追加することをお勧めします。

class Euler2 { 
    public static void main(String args[]) { 
     long n1=0,n2=1,n3,i,j; 
     long sum = n1 + n2; 
     for(i =2 ;i < 250; i++) { 
      if (n3 > 40000000) { 
       break; 
      } 
      else { 
       n3 = n1 + n2; 
       if (n3%2 == 0) { 
        sum += n3; 
       } 
       n1 = n2; 
       n2 = n3; 
      } 
     } 
     System.out.println("sum of all values: "+sum); 
    } 
} 
+0

リストに数値を格納する必要はありません。合計に直接追加する必要はありません。 –

+0

@tobias_k、ありがとう、それは本質的に最後のfor-loopを使うオーバーヘッドを取り除くでしょう。 if条件ブロックにsumを加算するだけです。それに応じて答えを編集しました。 – srp321

0

すべての偶数

long sum = 0 
for (int x = 1; x <= 200; x++) { 
    if (x % 2 == 0) 
    sum += x; 
} 

の合計私はあなたのロジックがあるかわかりません。

また、私は結果が長く

0

あなたのコードを持ついくつかの問題があります。

  • あなたが効果的にそれは変わりませんが、問題は(数字<= 4000000を要求に対し数は、< 3999999であるかどうかをチェックするには結果)
  • intIntegerに手動で変換する必要はなく、さらにの場合は、あなたは... for (Integer n : even) {sum += n;}
  • を、最終的なループを簡素化することができ、キャッシング
  • を利用するためにnew Integerが、Integer.valueOfを使うべきではありません...しかし、あなたは実際には前に、リスト内のすべてのそれらの数値を格納する必要はありません。合計
  • 実際問題を計算する:あなたがリストにそれぞれ数3回を追加している:それはsecondに移動したときに、その後thirdを、だ、と最初の時に最終的にそれはfirst
でいたときにここ

作業をする必要があり、いくつかの擬似コードです:

sum = 0 
current = 1 
next = 1 
while current <= 4000000: 
    if current % 2 == 0 then 
     sum += current 
    temp = next 
    next = current + next 
    current = temp 
関連する問題