Java 投影Euler#2无穷大?
我正在尝试求解,我一直得到的答案是“无穷大”或“NaN”(不是一个数字)。我尝试将数字的类型更改为aJava 投影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
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但是对于这个问题,您不需要高精度的计算。一切都在intint
范围内轻松完成。这个问题应该只需要一个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())))