gpt4 book ai didi

C++ 数字加负数

转载 作者:太空狗 更新时间:2023-10-29 23:51:49 25 4
gpt4 key购买 nike

所以我只是在练习编码一个斐波那契数列的动态解决方案,它将返回第 n 个斐波那契数,我一直遇到一个我不太明白的问题。我将两个正数加到一个负数上!

代码:

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 仅用于调试

enter image description here

最佳答案

您需要将 int 更改为 unsigned int 或更好的 unsigned long long。您的结果超出了系统上 int 的最大值。因为 int 是有符号的,当 most significant bit得到设置,它变成一个负数。请参阅标题为 maximum value of int 的 Stack Overflow 问题,以及 binary arithmatic 上的斯沃斯莫尔学院页面想要查询更多的信息。如果您使用的是 Visual Studio,请查看 Data Type Ranges 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;
}

关于C++ 数字加负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18680362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com