1

私はそれに多くの刺し傷を負いましたが、何が間違っているのか理解できないようです。これは、解決策に対する私の最近の試みの 1 つです。

他のソースからの正解は です4613732

/*
 *             PROBLEM 2
 * Each new term in the Fibonacci sequence is generated by adding the previous two terms. 
 * By starting with 1 and 2, the first 10 terms will be:
 *
 * 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
 *
 * By considering the terms in the Fibonacci sequence whose values do not exceed four 
 * million, find the sum of the even-valued terms.
 */

public class problem2 
{
    public static void main(String args[])
    {
        int sum = 0;

        int[] anArray = new int[4000000];
        anArray[0] = 1;
        anArray[1] = 2;

        for (int i = 2; i <= anArray.length - 1; i++) {
            anArray[i] = anArray[i - 1] + anArray[i - 2];

            if (anArray[i] % 2 == 0 && anArray[i] <= 4000000) {
                sum += anArray[i];
            }
        }
        System.out.println(sum);        
    }
}
4

6 に答える 6

1

まず、オーバーフローの問題を回避するために、2つが欠落しています:http://en.wikipedia.org/wiki/Integer_overflow、100万を超えたらすぐにbreakステートメントを挿入する必要があります。

于 2012-07-29T04:59:25.573 に答える
1

の精度を超えていますint。計算する数値が多すぎて、最終的に負の数値になります。配列のサイズを適切なもの (40 など) にするか、負の数を無視するように if ステートメントをチェックしてください。

実際には、配列のサイズを 40 に変更するだけです。これは、int 反転の後のすべてが間違っているためです。

int [] anArray = new int[40];

2また、配列の 2 番目の数字であるを追加していないことに注意してください。

とにかく気にしないので、数値が 4,000,000 を超えたときに for ループから抜け出すこともできます。

于 2012-07-29T04:51:56.233 に答える
0

合計の式を書く代わりに配列を使用すると、問題の解決策が非常に普通になります。配列の使用を避けるために、単純に等しい算術演算子を使用できます。私のコードソリューションはこのようなものです。お役に立てば幸いです。

       /*PRoject euler problem2*/
       /*Sum of even terms in fibonacci sequence*/
           public class Euler2
             {

                static long fibosum()
                 {
                    long sum=0;
                    long initialint=0;
              long secondint=1;
              long fibo=initialint+secondint;
                while(fibo<4000000)
                  {
                    if(fibo%2==0)
                {
                  sum=sum+fibo;
                }
                         initialint=secondint;
                   secondint=fibo;
                   fibo=initialint+secondint;
                        }
             return sum;
               }
             public static void main(String args[])
              {
                 Euler2 a=new Euler2();
           System.out.println("Sum of even fibonacci numbers below 4000000 is"+a.fibosum());
               }
  }
于 2013-02-27T15:50:10.383 に答える
0
for(int i=2;i<=anArray.length-1;i++){
            anArray[i]=anArray[i-1]+anArray[i-2];

            if(anArray[i]%2==0 && anArray[i]<=4000000){
                    sum+=anArray[i];
            }
        }

「合計」部分だけでなく、ループ内のフィボナッチ数の制限を確認する必要があります。チェックを外しているためオーバーフローしました。オーバーフローの後、数値はより小さな数値に「ラップ」され、4000000 よりも小さくなりました (おそらく、ここでは間違いなく)。

ここでオーバーフローを避けるためにBigIntegerを使用できます。(少なくとも Java 1.6 では) 優れたパフォーマンスはありませんが、この問題は解決します。

于 2012-07-29T04:50:22.860 に答える
0

ロジックは私には正しいように見えますが、非効率的なアプローチです。Project Euler は、より優れたアルゴリズムを見つけ出すように設計されているため、単純なアルゴリズムでは時間やメモリが不足している可能性があります。

フィボナッチ数のパターンを探して、より速いアプローチを考え出してください。

編集: 4000000 に達した後、ループから抜け出していないことを見逃していました。この場合、数値がオーバーフローし、誤った結果が得られます。数値が 4000000 を超えた後にブレークする必要があります。また、新しい数値を計算するために必要なのは最後の 2 つの数値のみであるため、その巨大な配列は完全に不要です。

于 2012-07-29T04:51:15.480 に答える