我正在尝试计算模数,其中可能非常巨大:高达10 ^ 18,是第n个斐波纳契数 这是我的代码,适用于小数字,但对于大数字,它会抛出OutOfMemoryError或NegativeArraySizeException。
import java.util.*;
public class FibonacciHuge {
private static long getFibonacciHugeFast(long n, long m) {
long[] arr = new long[(int) n + 1];
arr[0] = 0;
arr[1] = 1;
for (int i = 2; i < n + 1; i++) {
arr[i] = (arr[i - 1] + arr[i - 2]) % m;
}
return arr[(int) n];
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long n = scanner.nextLong();
long m = scanner.nextLong();
System.out.println(getFibonacciHugeFast(n, m));
}
}
答案 0 :(得分:1)
以下是对两个例外/错误的解释。
long[] arr = new long[(int) n + 1];
)。阅读:Primitive data types。 (基本上你在某个时候溢出,结果整数是负数)答案 1 :(得分:1)
如果n
可以 10 ^ 18 ,那么即使您不使用数组,它仍然会超时,因为您要运行循环直到{{ 1}}( 10 ^ 18 )来计算第n个斐波纳契数。
您可以使用矩阵求幂方法(线性递归方法)。您可以在this博客中找到详细的说明和程序。运行时间为n
。
希望这有帮助!!!
答案 2 :(得分:1)
您的代码存在两个问题