我创建了一种迭代计算Fibonacci数的方法(我不允许使用递归)。在指数47之后,我得到了奇怪的结果:
斐波纳契数47:-1323752223
斐波纳契数48:512559680
斐波纳契数49:-811192543
斐波纳契数50:-298632863
我尝试了不同的方法,但它改变了整个事情。 这是我的方法,任何想法?希望你能帮帮我。
public static long fiboIterative(int n) {
if (n == 0)
return 0;
if (n == 1 || n == 2)
return 1;
int previous = -1;
int result = 1;
for (int i = 0; i <= n; i++) {
int sum = result + previous;
previous = result;
result = sum;
}
return result;
}
}
答案 0 :(得分:8)
您已经溢出了用于存储当前斐波那契数字的int
。在没有溢出的情况下,int
中可以存储的最大值略高于20亿。 Integer.MAX_VALUE
is 2147483647
。您可以为long
,sum
和previous
使用更大的数据类型(例如result
)来打印更多结果。但是,它最终也会溢出。 Long.MAX_VALUE
is 9223372036854775807
,有点超过9分。
答案 1 :(得分:4)
您正在遇到integer overflow:Java的int
类型可以表示-2,147,483,648和2,147,483,647之间的数字。第47个斐波纳契数是2,971,215,073。
将result
,sum
和previous
的类型更改为long
,将范围扩展到约90斐波纳契数。
如果您需要更多内容,请使用BigInteger
。
答案 2 :(得分:3)
你正在获得整数溢出。
您的结果是一个签名号码,无法存储+ 2^31
以外的任何内容,大约
考虑使用BigInteger
而不是int
或long
。