Java 为什么它会返回超过第47个斐波那契数的负数?
我编写了一个程序来存储斐波那契数,并将检索第n个斐波那契数。它工作正常,直到第50个斐波那契函数返回一个负数 getFibonacci(47)返回1836311903,但Java 为什么它会返回超过第47个斐波那契数的负数?,java,fibonacci,Java,Fibonacci,我编写了一个程序来存储斐波那契数,并将检索第n个斐波那契数。它工作正常,直到第50个斐波那契函数返回一个负数 getFibonacci(47)返回1836311903,但 getFibonacci(48)返回-1323752223。为什么会这样 public class Fibonacci { static HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); public st
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);
}
}
公共类Fibonacci{
静态HashMap map=newhashmap();
公共静态void main(字符串[]args){
int x;
商店号码(50);
System.out.println(getFibonacci(48));
}
公共静态无效存储Fibonacciumbers(int n){
对于(int x=1;x这是因为int
类型的值太高了。最大值为2147483647,此时它将重新开始。如果要正确表示更大的数字,需要使用不同的数据类型,例如long
。这是因为已达到整数的最大值。当如果你试图给它添加一个值,它就会溢出,并“环绕”到负值
另一种选择是使用支持更高最大值的类型(例如Long
)
在某些情况下,您可能会被迫切换到更复杂的类型,但这些类型专门用于存储非常大的整数(例如)。最大java整数为2^31-1或2147483647。达到该值后,您将开始返回负数
您可以使用常量Integer.MAX_值作为在达到该值后停止程序的一种方法。这被调用,并且当一个数字的增量超过/低于其最大/最小(内存)界限时发生(对于java.lang.Integer,这将是-2^31和2^31-1)一种情况,当算术运算(如乘法或加法)的结果超过用于存储它的整数类型的最大值时,会发生这种情况。在HashMap中,您将斐波那契数存储为整数。一个整数可以保存的最大值是2147483647
(2^31-1)
所以根据你们的计算,斐波那契(47)必须超过最大值,溢出正在发生
将HashMap值类型更改为Long。这将解决您的问题。很抱歉,我不是英语母语人士…对我来说,溢出是溢出,即使在堆栈上也是如此:-)