如何解决使用 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
解决方法
斐波那契数增长很快。
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 举报,一经查实,本站将立刻删除。