簡體   English   中英

斐波那契模

[英]Fibonacci n modulo m

我正在嘗試計算modul模𝑚,其中𝑛可能真的很大:最多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));
}
}

這是您的兩個例外/錯誤的解釋。

  1. OutOfMemoryError異常:由於您正在嘗試創建一個巨大的數組,而該數組超出了可能的大小。 請參閱此問題Java數組是否具有最大大小?
  2. NegativeArraySizeException:由於您正在將long轉換為整數(代碼long[] arr = new long[(int) n + 1]; )。 閱讀: 基本數據類型 (基本上,您在某個時候溢出,結果整數為負數)

如果n可以是10 ^ 18 ,那么即使您不使用數組,它也仍然會超時,因為您將運行一個循環直到n (即10 ^ 18 )來計算第n個斐波那契數。

您可以使用矩陣求冪方法(線性遞歸方法)。 您可以在博客中找到詳細的說明和過程。 運行時間為O(log n)

希望這可以幫助!!!

您的代碼有兩個問題

  1. 您只需要知道斐波那契元素n-1和n-2即可計算元素n,因此您不需要數組,而只需兩個變量。
  2. 由於(a + b)%m ==(a%m + b%m),因此可以從n-1和n-2元素以m為模計算第n個元素。 實際上,您將無法長時間存儲第10 ^ 18個斐波那契數,因為它的值很大-斐波那契數列呈指數增長。 您可能唯一遇到的問題是%m + b%m溢出,因此您應該將m限制為Long.MAX_VALUE / 2,因為您不知道僅僅知道n實際元素的大小。 或者,您可以在函數中添加溢出檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM