找到大数的斐波纳契数

时间:2016-07-24 17:30:33

标签: c++ dynamic biginteger fibonacci

我编写了以下程序来查找大型斐波纳契数的模数。这可以解决大量问题但在fibo_dynamic(509618737,460201239,229176339) 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];
        }
    }
}

1 个答案:

答案 0 :(得分:4)

值会溢出,因为斐波那契数字增长得非常快。即使对于原始的斐波纳契系列(其中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))时间内计算出第n个斐波纳契数。它是“使用矩阵指数解决递归关系”。斐波纳契数遵循以下线性递归关系:

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

阅读this以了解该技术。