我正在测试此代码,以便在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或更大的数字并仍使用数组进行管理?
答案 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}}为–9223372036854775808
到9223372036854775807
将您的斐波那契数列中的第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