繁体   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