斐波那契序列long []数组在索引92之后抛出负数

时间:2016-06-02 03:13:53

标签: java arrays fibonacci

我正在测试此代码,以便在long []数组中插入Fibonacci序列:

public class Test {
    public static void Fibonacci(int n){
        long[] array = new long[n];
        array[0]=1;
        for (int i = 1; i < n; i++) {
            if (i==1) {
                array[i]=i;
            }
            else {
                array[i] = array[i-2] + array[i-1];
            }
        }
        System.out.println(array[n-3]+"    "+array[n-2]); // verify sum
        System.out.println(array[n-1]);
    }
    public static void main(String[] args) {

        Scanner scan = new Scanner(System.in);

        System.out.print("Insert Fibonacci sequence index: ");
        int n = scan.nextInt();

        Fibonacci(n);
    }
}

然而,在第92位之后,它开始抛出错误或负数。我使用此Fibonacci Calculator来验证数字,直到92它是正确的。 我在这里看到了一些关于这个问题的问题,大多数答案都说它关于Integer溢出,并且你应该使用long,我正在使用它。

超过长型限制的第93个数字?我应该使用什么来达到100或更大的数字并仍使用数组进行管理?

4 个答案:

答案 0 :(得分:2)

您正在遇到数字溢出。使用任意精度arichmetics来解决此问题:将long[]替换为BigInteger[],并将公式更改为方法调用,例如

array[0] = 1;
...
array[i] = array[i-2] + array[i-1];

变为

array[0] = BigInteger.ONE;
...
array[i] = array[i-2].add(array[i-1]);

答案 1 :(得分:2)

你正在超越long的范围。您可以使用BigInteger(并从循环中提取array[1]); 1 之类的东西

public static void fibonacci(int n) {
    BigInteger[] array = new BigInteger[n];
    array[0] = array[1] = BigInteger.ONE;

    for (int i = 2; i < n; i++) {
        array[i] = array[i - 2].add(array[i - 1]);
    }
    System.out.println(array[n - 3] + "    " + array[n - 2]); // verify sum
    System.out.println(array[n - 1]);
}

1 另外,请遵循Java命名约定。方法名称以小写字母开头,Fibonacci看起来像一个类名。

答案 2 :(得分:1)

this table开始,第92个斐波纳契数为7540113804746346429,第93个为12200160415121876738

Java long的{​​{3}}为–92233720368547758089223372036854775807

将您的斐波那契数列中的第93个数字与long所能得到的最大值进行比较,可以揭示正在发生的事情:

9223372036854775807   -- max long value
7540113804746346429   -- 92nd number in Fibonacci sequence (works)
12200160415121876738  -- 93rd number in Fibonacci sequence (doesn't work)

您可以考虑使用BigInteger来存储序列号。

答案 3 :(得分:1)

你是正确的,第93个数字大于2 ^ 63 - 1(java中最大可能的长值)。这意味着在第92次迭代之后变量将溢出。如果您想使用更大的数字,您应该查看BigInteger