项目欧拉问题2:偶数斐波纳契数的总和

时间:2011-07-08 22:17:50

标签: java algorithm

我正在尝试用Java解决Project Euler problem 2

public class Euler2 {

public static long GenerateFibonacci(int term) {

    long sum = 0;
    long fib = 0;
    long f1 = 0;
    long f2 = 1;
    if (term <=1) return term;
    for (int i = 1; i <= term; i++) {
        fib = f1 + f2;
        f1 = f2;
        f2 = fib;
        if(fib %2 ==0)
            sum += fib;         
    }
    return sum;

}

    /**
     * @param args
     */
    public static void main(String[] args) {

        int n = 100;
        long result = GenerateFibonacci(n);
        System.out.println("The sum of the even Fibonacci numbers is: "+result);
    }
}

n 很小时,我得到了正确的答案,但是对于更大的值,我得到了错误的结果。这有什么问题?

6 个答案:

答案 0 :(得分:3)

int仅限于32位精度,long至64位。

当你通过添加结果大于位数限制的数字超过限制时,它们会“翻转”并且你会从添加结果中丢失最重要的位 - 实质上,它们被“舍入”到32/64位。

以下是滚动的示例:

int i = Integer.MAX_VALUE; // 2147483647
i++; // -2147483648

粗略地说,每个斐波纳契数都是前一个的两倍,所以粗略地说,你只能使用long作为总数来处理64次迭代。

答案 1 :(得分:2)

Java中最大的long值是9223372036854775807.将此值加1会产生-9223372036854775807,因为大多数编程语言中的整数值来自一组有限的值,当您达到最大值并添加一个序列“wrap”时“到了开头。”

如果您需要超出此范围,您将获得第100个Fibonacci数字,请使用BigInteger。

答案 2 :(得分:1)

总和大于Long.MAX_VALUE。你对@Bohemian的评论是正确的n小于这个限制,但这个简单系列的增长速度相当令人惊讶。例如,第100个斐波那契数字是354224848179261915075.前100个数字的总和是一个20位数字,只是为了让您感觉到您正在处理的规模。

答案 3 :(得分:1)

你需要使用BigInteger,你也可以使用每三个斐波纳契数是偶数的事实。

public static BigInteger sumOfEvenFibonacci(int term) {
    BigInteger sum = BigInteger.ZERO;
    BigInteger f1 = BigInteger.ONE;
    BigInteger f2 = BigInteger.ONE;
    for (int i = 1; i <= term; i+=3) {
        BigInteger fib = f1.add(f2);
        sum = sum.add(fib);
        f1 = f2.add(fib);
        f2 = fib.add(f1);
    }
    return sum;
}

System.out.println(sumOfEvenFibonacci(100));

打印

1213946614199987541226

答案 4 :(得分:1)

您可以使用以下代码提高'GenerateFibonacci'的效率。这应该是一个评论,但我不能在评论中格式化代码,我在回答中这样做,

public class FibUtil {

//Constants used in equation to calculate nth fib term
private static final double fibA=1/Math.sqrt(5);
private static final double fibB=(1+Math.sqrt(5))/2;
private static final double fibC=(1-Math.sqrt(5))/2;

public static double getNthFibTerm(long n){
    return fibA*(Math.pow(fibB, n)-Math.pow(fibC, n));
}

}

此外,根据euler 2问题陈述,您只能添加第3个倍数为3的项。我将“为什么”留给您。

答案 5 :(得分:-1)

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package evenfibonaccisum;

import java.math.BigInteger;

/**
 *
 * @author blades of Aragon
 */
public class EvenFibonacciSum {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        long a=0;
      long b=1;
       long fib=1;
        int i=10;
        long sum=0;
        while(fib<=4000000){
        fib=a+b;
        a=b;
        b=fib;
           if(fib>=4000000){
           break ;
           }
           else{

               if(fib%2==0){

               sum=sum+fib;

               }


           }

        }
         System.out.println("sum of even Fibonacci "+sum);  






        }



    }