项目欧拉#2无限?

时间:2012-01-19 21:06:29

标签: java fibonacci

我正在尝试解决Euler's Project #2并且我一直得到答案为“无限”或“NaN”(不是数字)我尝试将数字类型更改为int(原来{{ 1}}),但这没有解决任何问题只是给了我答案“-1833689714”

Double

问题是:

  

Fibonacci序列中的每个新术语都是通过添加前两个术语生成的。从1和2开始,前10个术语将是:

     

1,2,3,5,8,13,21,34,55,89,......

     

通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和。

7 个答案:

答案 0 :(得分:8)

您正在考虑Fibonacci序列的前4,000,000个术语,而不是不超过4,000,000的第一个x术语。

答案 1 :(得分:3)

您的问题是整数溢出:在Java中,int变量仅限于Integer.MAX_VALUE(2147483647)。如果在计算中超过此值,则会溢出到Integer.MIN_VALUE,即最小的值。参见:

public class IntegerOverflow {
    public static void main(String[] args) {
        int i = Integer.MAX_VALUE;
        System.out.println("i = Integer.MAX_VALUE: " + i);
        System.out.println("i + 1: " + (i + 1));
        System.out.println("i + 2: " + (i + 2));
    }
}

为避免溢出问题,请使用java.math.BigInteger类提供的任意精度整数执行计算:

import java.math.BigInteger;

public class BigIntegerExample {
    public static void main(String[] args) {
        BigInteger b = BigInteger.valueOf(Long.MAX_VALUE);
        System.out.println("b = Long.MAX_VALUE: " + b);
        System.out.println("b**2: " + b.multiply(b));
        System.out.println("b**3: " + b.pow(3));
        System.out.println("b**10: " + b.pow(10));
    }
}

注意:由于您没有就问题本身寻求帮助,我只是在回答这个问题。希望这有帮助

答案 2 :(得分:2)

您可能遇到溢出。 fibo(4000000)高于MAX_INT

注意:您不会被要求在4,000,000个第一个数字中找到总和偶数,而是要找到未结束的偶数元素的总和4000000。

您应该检查f< 4000000是否{,1}},如果没有,请休息,而不是等到i达到4,000,000

答案 3 :(得分:1)

您正在检查前400万个斐波纳契,您只需检查术语,直到斐波纳西术语超过400万然后停止。你得到负数的原因是你最终得到的斐波纳契术语大于Integer.MAX_INT,此时你会溢出并开始得到负数,这就是你的总数。如果你不确定最终答案是否会超过Integer.MAX_INT,你应该使用long作为累加器而不是int。

答案 4 :(得分:0)

使用GMP处理C中的大数字。 之前的一点思考也不会造成伤害(比如奇数与偶数有多少,斐波那契序列的前n个元素的总和是多少)......

答案 5 :(得分:0)

您可以使用long代替int

每三个表达式都是偶数,因此您只需要评估每三个值。这是非常快的,因为它循环次数较少,你不必测试偶数/奇数。

您只需要n而不是i,而不是400万。

答案 6 :(得分:0)

这就是我得到答案的方式:

def fib():
        x,y = 0,1
        while True:
            yield x
            x,y = y, x+y

def even(seq):
    for number in seq:
        if not number % 2:
            yield number

def under_a_million(seq):
    for number in seq:
        if number > 4000000:
            break
        yield number   

print sum(even(under_a_million(fib())))

-M1K3