项目欧拉没有。 2

时间:2012-07-29 04:39:28

标签: java

我对它采取了很多刺,我似乎无法弄清楚我做错了什么。这是我最近尝试解决的问题之一。

我知道其他来源的正确答案是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);        
    }
}

6 个答案:

答案 0 :(得分:1)

你超过了int的精确度。你计算的数字太多,最终得到负数。使数组的大小合理(如40),或者检查if语句以忽略负数。

实际上,只需将数组的大小更改为40,因为int翻转后的任何内容都是错误的。

int [] anArray = new int[40];

另请注意,您没有添加2,即阵列中的第二个数字。

当你的数字超过4,000,000时,你也可以跳出for循环,因为你无论如何都不关心它们。

答案 1 :(得分:1)

首先,你错过了这两个 其次,为了避免溢出问题http://en.wikipedia.org/wiki/Integer_overflow,你应该在超过一百万的时候插入一个break语句。

答案 2 :(得分: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];
            }
        }

你应该检查循环中Fibonacci数的极限,而不仅仅是“sum”部分。因为你错过了支票,所以你满溢了。溢出后,数字“包裹”回较小的数字,导致它们(可能,但绝对在这里)小于4000000。

您可以使用BigInteger来避免溢出。它没有很好的性能(至少对于Java 1.6而言),但它可以解决这个问题。

答案 3 :(得分:0)

逻辑对我来说是正确的,但这是一种低效的方法。项目Euler旨在让您找出更好的算法,因此您的天真算法可能会耗尽时间或内存。

尝试寻找斐波那契数字中的模式,以便采用更快的方法。

编辑:我错过了你在达到4000000后没有突破循环。在这种情况下,数字会溢出并给你不正确的结果。你需要在数字超过4000000后中断。此外,这个巨大的数组是完全没必要的,因为你只需要最后两个数字来计算每个新数字。

答案 4 :(得分: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());
               }
  }

答案 5 :(得分:-1)

如果您观察到斐波那契序列,则每三个数字都是偶数:

1,1,的 2 下,3,5,的 8 下,13,21,的 34

所以长度为3的数组就足够了。我们可以生成接下来的3个斐波纳契数并将其存储(覆盖)在数组中,数组中所有第三个元素(偶数为fib数)的总和将给出我们斐波那契数列中所有偶数的总和。

代码:

public class Prob2 {
    public static int sumOfEvenFibonacci(int limit){
        int fibonacci[] = {1, 1, 2}; 
        int j, sum = 2;

        while(fibonacci[2] < limit){
            for(j = 0; j < 3; j++){
                fibonacci[j] = fibonacci[(j+1)%3] + fibonacci[(j+2)%3];
            }
            sum += fibonacci[2];
        }
        return sum - fibonacci[2];
    }
}

琐碎的测试案例:

public class TestProb2 {

@Test
public void testSumOfMultiples(){
    int actual = Prob2.sumOfEvenFibonacci(15);
    assertEquals(10, actual);

    actual = Prob2.sumOfEvenFibonacci(50);
    assertEquals(44, actual);

    actual = Prob2.sumOfEvenFibonacci(200);
    assertEquals(188, actual);

    actual = Prob2.sumOfEvenFibonacci(4000000);
    assertEquals(4613732, actual);
}

}

P.S:这个答案可能并不能完全回答OP的问题,但希望分享这项技术,因为找到它的快乐。希望它可以帮助那些在这里寻找解决方案的人。