簡體   English   中英

尋找大數的斐波那契數

[英]Finding the fibonacci number of large number

我編寫了以下程序來查找大斐波那契數的模數。 這可以解決大量問題,但在fibo_dynamic(509618737,460201239,229176339)這樣a = 509618737情況下無法計算,其中a = 509618737b = 460201239N = 229176339 請幫助我完成這項工作。

long long  fibo_dynamic(long long  x,long long  y,long long  n, long long a[]){
    if(a[n]!=-1){
         return a[n];
    }else{
        if(n==0){
            a[n]=x;
            return x;
        }else if(n==1){
            a[n]=y;
            return y;
        }else {
            a[n]=fibo_dynamic(x,y,n-1,a)+fibo_dynamic(x,y,n-2,a);
            return a[n];
        }
    }
}

這些值將溢出,因為斐波那契數迅速增加。 即使對於原始的斐波那契數列(其中f(0) = 0f(1) = 1 ), f(90)的值也超過20位,並且不能以C ++的任何原始數據類型存儲。 您可能應該使用模運算符(因為您在問題中提到了它)將值保持在這樣的范圍內:

a[n] = (fibo_dynamic(x,y,n-1,a) + fibo_dynamic(x,y,n-2,a)) % MOD;

它是安全的mod在每一個階段的價值,因為mod操作有以下規則:

if a = b + c, then:
a % n = ((b % n) + (c % n)) % n

同樣,您已經使用了遞歸版本來計算斐波那契數(盡管您已經記住了較小的子問題的結果)。 這意味着將有很多遞歸調用,這增加了額外的開銷。 如果可能,最好使用迭代版本。

接下來,您將使用變量n索引數組。 因此,我假設數組a的大小至少為n 問題中提到的n的值非常大。 您可能無法在本地計算機中聲明如此大的數組(考慮整數為4 bytes ,數組a的大小約為874 MB )。

最后,程序的復雜度為O(n) 有一種技術可以計算O(log(n))時間中的第O(log(n))斐波那契數。 它是“使用矩陣冪求解遞歸關系”。 斐波那契數遵循以下線性遞歸關系:

f(n) = f(n-1) + f(n-2)   for n >= 2

閱讀本文以了解技術。

暫無
暫無

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

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