所以我只是练习编写斐波那契数列的动态解决方案,该解决方案将返回第 n 个斐波那契数,但我不断遇到一个我不太明白的问题。我得到两个正数加上一个负数!
Code:
int fib(int n) {
vector<int> v;
v.push_back(1);
v.push_back(1);
for (int i = 2; i <= n; i++) {
v.push_back( v.at(i-1) + v.at(i-2) );
cout << v.at(i-1) << " + " << v.at(i-2) << " = " << (v.at(i-1) + v.at(i-2)) << endl;
}
return v.at(n);
}
尝试运行 fib(50),注意 cout 仅用于调试
你需要改变int
to unsigned int
甚至更好unsigned long long
。你的结果超出了最大值int
在您的系统上。因为int
被签署,当最高有效位设置后,它变为负数。请参阅标题为“堆栈溢出”的问题int 的最大值,以及斯沃斯莫尔学院的这个页面二进制算术了解更多信息。如果您使用的是 Visual Studio,请查看数据类型范围MSDN 上的文章。
除了切换到unsigned long long
,您可能应该检查诸如此类的溢出错误并引发异常。代码的修订版本可能如下所示。
unsigned long long fib(int n) {
vector<unsigned long long> v;
v.push_back(1);
v.push_back(1);
for (int i = 2; i <= n; i++) {
if( v.at(i-1) > (std::numeric_limits<unsigned long long>::max() - v.at(i-2)) )
throw std::overflow_error("number too large to calculate");
v.push_back( v.at(i-1) + v.at(i-2) );
cout << v.at(i-1) << " + " << v.at(i-2) << " = " << (v.at(i-1) + v.at(i-2)) << endl;
}
return v.at(n);
}
您还希望确保调用函数的代码可以使用try... catch...
。这是一个例子
try {
std::cout << "2000th number = " << fib(2000) << std::endl;
} catch( std::overflow_error& ex ) {
std::cerr << ex.what() << std::endl;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)