为什么它会在第47个斐波那契数字之后返回负数?

时间:2015-04-18 01:42:13

标签: java fibonacci

我写了一个程序来存储斐波纳契数,并将检索第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);
    }
}

6 个答案:

答案 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) )