我写了一个程序来存储斐波纳契数,并将检索第n个斐波纳契数。它工作正常,直到第50个Fibonacci返回负数。
getFibonacci(47)返回1836311903但是 getFibonacci(48)返回-1323752223。这是为什么?
public class Fibonacci {
static HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
public static void main(String[] args) {
int x;
storeFibonacciNumbers(50);
System.out.println(getFibonacci(48));
}
public static void storeFibonacciNumbers (int n){
for (int x=1; x <= n; x++ ){
if(x == 1){
map.put(x, 0);
}
else if (x == 2) {
map.put(x, x-1);
}
else
map.put(x, map.get(x-1) + map.get(x-2));
}
}
public static long getFibonacci (int x){
return map.get(x);
}
}
答案 0 :(得分:2)
这是因为已达到Integer
的最大值。当你试图为它添加一个值时,它会溢出,并且&#34;回绕&#34;否定。
另一种方法是使用支持更高最大值的类型(例如Long
)。
在某些时候,您可能会被迫切换到更复杂的类型,但专门用于存储非常大的整数(例如BigInteger
)。
答案 1 :(得分:2)
在HashMap中,您将Fibonacci数存储为整数。 Int可以容纳的最大值是2147483647
(2 ^ 31-1)
因此,根据您的计算,斐波纳契(47)必须超过该最大值并发生溢出。
将HashMap值类型更改为Long。它会解决你的问题。
答案 2 :(得分:1)
Integer Overflow是当算术运算的结果(例如乘法或加法)超过用于存储它的整数类型的最大大小时发生的条件。
答案 3 :(得分:0)
这是因为int
类型只是如此之高。最大值是2147483647,此时它将重新开始。如果要正确表示更大的数字,则需要使用其他数据类型,例如long
。
答案 4 :(得分:0)
最大java整数是2 ^ 31-1或2147483647.达到该值后,您将开始返回负数。
您可以使用常量Integer.MAX_VALUE作为在达到该值时停止程序的方法。
答案 5 :(得分:0)
这称为Integer Overflow,当一个数字超过/落在其最大/最小(内存)边界之下时发生(对于java.lang.Integer,这将是-2 ^ 31和2 ^ 31-1) )