我正在尝试解决Euler's Project #2并且我一直得到答案为“无限”或“NaN”(不是数字)我尝试将数字类型更改为int
(原来{{ 1}}),但这没有解决任何问题只是给了我答案“-1833689714”
Double
问题是:
Fibonacci序列中的每个新术语都是通过添加前两个术语生成的。从1和2开始,前10个术语将是:
1,2,3,5,8,13,21,34,55,89,......
通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和。
答案 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