我试图计算模,这里可能很大:高达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));
}
}
发布于 2016-09-20 18:34:09
这是你的两个异常/错误的解释。
long[] arr = new long[(int) n + 1];
)。读这个:原始数据类型。(基本上,在某一点上,你已经溢出了,所得到的整数是一个负数)发布于 2016-09-20 21:56:38
如果n
可以是10^18,那么即使不使用数组,它仍然会超时,因为您将运行一个循环直到n
(即10^18)来计算第n个斐波那契数。
你可以使用矩阵指数法(线性递推法)。您可以在这博客中找到详细的解释和过程。运行时是O(log n)
。
希望这会有帮助!
发布于 2016-09-20 22:15:22
您的代码有两个问题
https://stackoverflow.com/questions/39606533
复制相似问题