[英]Finding the fibonacci number of large number
我編寫了以下程序來查找大斐波那契數的模數。 這可以解決大量問題,但在fibo_dynamic(509618737,460201239,229176339)
這樣a = 509618737
情況下無法計算,其中a = 509618737
, b = 460201239
和N = 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) = 0
和f(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.