Java 投影Euler#2无穷大?

Java 投影Euler#2无穷大?,java,fibonacci,Java,Fibonacci,我正在尝试求解,我一直得到的答案是“无穷大”或“NaN”(不是一个数字)。我尝试将数字的类型更改为aint(最初是Double),但这并没有解决任何问题,只是给了我答案“-1833689714” public class-Pro{ 静态int g=1; 静态整数n,f=0; 公共静态void main(字符串参数[]){ 对于(int i=0;i您可能会遇到溢出。fibo(4000000)远远高于MAX_int 注意:不要求您在4000000个第一个数字中查找偶数之和,而是要查找其值不超过400

我正在尝试求解,我一直得到的答案是“无穷大”或“NaN”(不是一个数字)。我尝试将数字的类型更改为a
int
(最初是
Double
),但这并没有解决任何问题,只是给了我答案“-1833689714”

public class-Pro{
静态int g=1;
静态整数n,f=0;
公共静态void main(字符串参数[]){

对于(int i=0;i您可能会遇到溢出。
fibo(4000000)
远远高于
MAX_int

注意:不要求您在4000000个第一个数字中查找偶数之和,而是要查找其值不超过4000000的偶数元素之和


您应该检查
f<4000000
,如果没有,请中断,不要等待
i
达到4000000

您正在考虑Fibonacci序列的前4000000个项,而不是不超过4000000的前
x
项。

您正在检查前400万个Fibonacci,您只需要检查不超过4000000的项直到fibonnaci项大于400万,然后停止。得到负数的原因是最终得到的fibonacci项大于Integer.MAX_INT,此时溢出并开始得到负数,并将其添加到总数中。如果不是正数,则最终的answer将超过Integer.MAX_INT,您应该使用long作为累加器,而不是INT。

用于处理C中的大数字。
之前的一点思考也不会有什么坏处(比如奇数与偶数的频率,Fibonacci序列前n个元素的和是多少).

您的问题是整数溢出:在Java中,
int
变量被限制为
integer.MAX\u VALUE
(2147483647)。如果在计算中超过此值,则溢出为
整数.MIN_值
,即最小的负值。请参阅:

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));
    }
}
为避免溢出问题,请使用类提供的任意精度整数执行计算:



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

您可以使用
long
而不是
int

每三个表达式都是偶数,所以您只需要计算每三个值。这要快得多,因为它循环次数较少,并且您不必测试偶数/奇数


你只需要
n
而不需要
i
,它少于400万。

这就是我得到答案的原因:

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

您可能还想检查BigInteger类:这不是
C
,java有自己的
BigInteger
类。同样,对于这个问题
long
已经足够了。使用
long
可能已经足够了,但是对于高精度计算来说,
BigInteger
是首选:@Danilopiazzarunga但是对于这个问题,您不需要高精度的计算。一切都在int
int
范围内轻松完成。这个问题应该只需要一个
int
。您是对的,但是:在这个问题中使用
biginger
的性能损失可以忽略不计,使用
biginger
您不必担心溢出ws.+1感谢你用便条回答问题,感谢你保持体育帮助的精神。谢谢,我还没醒;)现在明白了
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));
    }
}
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())))