我正在尝试用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 很小时,我得到了正确的答案,但是对于更大的值,我得到了错误的结果。这有什么问题?
答案 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);
}
}