微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Dynamic Programmin 得到 n = 656 Nth Fibonacci 数的错误答案

如何解决使用 Dynamic Programmin 得到 n = 656 Nth Fibonacci 数的错误答案

class Solution {
  public:
  
    
    long long int nthFibonacci(long long int n){
        // code here
        //TABULATION
        long long int lookup[1001];
        lookup[0]=0;
        lookup[1]=1;
        for(long long int i=2;i<=n;i++){
            lookup[i]=lookup[i-1]+lookup[i-2];
        }
        return (lookup[n]%1000000007);
    }
};

当我在 GFG 上提交时,它显示您的代码为 n=656 提供了错误输出

错误的答案。 !!!错误答案

可能您的代码无法针对多个测试用例 (TC) 正常工作。

您的代码失败的第一个测试用例:

输入: 656

它的正确输出是: 823693831

您的代码输出是: -584713349

解决方法

斐波那契数增长很快。

fib(n) / (pow(phi,n)) -> 1/sqrt(5) as n -> infinity
where phi is the golden ratio,phi ~= 1.618

这意味着 fib(n) 需要大约

n*log2(phi)-0.5log2(5) ~ 0.694*(n-2) bits.

因此 fib(656) 需要大约 452 位。 long long int 不太可能那么大!

在您的原始代码中,long long int 表无法保存较大斐波那契数的正确结果。

在 C(我认为是 C++)中,检测和纠正溢出是很尴尬的。最好确保它永远不会发生。在您的情况下,您只需要斐波那契数模 m (m=1000000007)。所以你可以用斐波那契数模 m 来填充表格。由于 m 适合 32 位,因此所有数字都以它为模并且其中两个的和适合 32 位,因此不会发生溢出。

顺便说一下,您修改后的代码中有一些多余的模组;你可以有

for(long long int i=2;i<=n;i++){
    lookup[i]=(lookup[i-1]+lookup[i-2])%mod;
}

因为当你使用它时,lookup[i-1] 已经减少了 mod m。

,

更新:找到了问题的正确解决方案,但仍然不知道我之前的代码有什么问题 如果有人可以看看正确的解决方案并指出我的错误..提前致谢!! 正确的解决方案:

class Solution {
  public:
  
    
    long long int nthFibonacci(long long int n){
        // code here
        //TABULATION
        const long long int mod=1000000007;
        long long int lookup[1001];
        lookup[0]=0;
        lookup[1]=1;
        for(long long int i=2;i<=n;i++){
            lookup[i]=(lookup[i-1]%mod+lookup[i-2]%mod)%mod;
        }
        return lookup[n];
    }
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。