为什么我的 C++ 斐波那契序列代码在 46 次迭代后给出负值
Why does my c++ fibonacci sequence code give negative values after 46 iterations
每当我尝试从 for 循环中取出前两次迭代时,代码也不起作用。当我这样做时,我得到非常高的数字,然后在 11 次迭代中得到 0,并且我的 i 值没有改变。出于某种原因,它在循环开始时的向量大小也为 3,但这可能与它仍然希望在第一项中将 0 + 0 相加这一事实有关。它犯的错误是它把两个正确的值相加,结果不知何故得到了一个负整数。这会为循环的其余部分抛出所有其他值。
#include <iostream>
#include <vector>
int main(){
std::vector<int> vector;
vector.push_back(0);
vector.push_back(1);
for (int i=0; i <= 47; i++) {
if (i < 1) {
std::cout << vector[i] << ", \n";
}
vector.push_back(vector[i] + vector[i + 1]);
std::cout << vector[i] << " = " << vector[i-2] << " + " << vector[i-1] << ": " << "vector size" << vector.size() << ", \n";
}
}
负值对你来说应该是一个很大的暗示。 int
的最大值为 2147483647
。你溢出 int
并且它环绕为负值。
如果您使用更大的类型,例如 std::uint64_t
,您可以适当推迟溢出。它的最大值是:18446744073709551615
.
最后,在循环中打印会产生大量难以破译的重复。只需在循环完成后打印您的向量,并用较少的迭代次数进行测试,以确保您的算法正常运行。
#include <cstdint>
#include <iostream>
#include <limits>
#include <vector>
int main() {
std::vector<std::uint64_t> vector{0, 1};
for (int i = 0; i < 47; i++) {
vector.push_back(vector[i] + vector[i + 1]);
}
for (auto i : vector) {
std::cout << i << ' ';
}
std::cout << '\n';
}
创建序列的 for 循环迭代 47 次,因此请仔细检查您的要求。
我不太了解 C++,但据我所知,您使用的是 int
,有符号整数的范围通常从 -2,147,483,648 到 2,147,483,647。斐波那契数列中的第 47 个数字是 2,971,215,073,因此您无法将其存储在 int 中。当你 overflow 它(超出它的限制)时,你会得到各种各样的废话。好吧,实际上不是废话,当你超出限制的一个数字时,例如 2,147,483,648,你应该得到 -2,147,483,648(你从最小的数字开始加一),所以你超过限制的数量是从最小的数字开始的偏移量(-2,147,483,648)。如果您尝试存储太小的数字(下溢),也会发生同样的情况,一旦低于最低数字,它将变为正值。
在您的情况下,您至少需要一个无符号整数,并且要存储更大的数字,您有 long int
、long long int
和 unsigned long long int
每当我尝试从 for 循环中取出前两次迭代时,代码也不起作用。当我这样做时,我得到非常高的数字,然后在 11 次迭代中得到 0,并且我的 i 值没有改变。出于某种原因,它在循环开始时的向量大小也为 3,但这可能与它仍然希望在第一项中将 0 + 0 相加这一事实有关。它犯的错误是它把两个正确的值相加,结果不知何故得到了一个负整数。这会为循环的其余部分抛出所有其他值。
#include <iostream>
#include <vector>
int main(){
std::vector<int> vector;
vector.push_back(0);
vector.push_back(1);
for (int i=0; i <= 47; i++) {
if (i < 1) {
std::cout << vector[i] << ", \n";
}
vector.push_back(vector[i] + vector[i + 1]);
std::cout << vector[i] << " = " << vector[i-2] << " + " << vector[i-1] << ": " << "vector size" << vector.size() << ", \n";
}
}
负值对你来说应该是一个很大的暗示。 int
的最大值为 2147483647
。你溢出 int
并且它环绕为负值。
如果您使用更大的类型,例如 std::uint64_t
,您可以适当推迟溢出。它的最大值是:18446744073709551615
.
最后,在循环中打印会产生大量难以破译的重复。只需在循环完成后打印您的向量,并用较少的迭代次数进行测试,以确保您的算法正常运行。
#include <cstdint>
#include <iostream>
#include <limits>
#include <vector>
int main() {
std::vector<std::uint64_t> vector{0, 1};
for (int i = 0; i < 47; i++) {
vector.push_back(vector[i] + vector[i + 1]);
}
for (auto i : vector) {
std::cout << i << ' ';
}
std::cout << '\n';
}
创建序列的 for 循环迭代 47 次,因此请仔细检查您的要求。
我不太了解 C++,但据我所知,您使用的是 int
,有符号整数的范围通常从 -2,147,483,648 到 2,147,483,647。斐波那契数列中的第 47 个数字是 2,971,215,073,因此您无法将其存储在 int 中。当你 overflow 它(超出它的限制)时,你会得到各种各样的废话。好吧,实际上不是废话,当你超出限制的一个数字时,例如 2,147,483,648,你应该得到 -2,147,483,648(你从最小的数字开始加一),所以你超过限制的数量是从最小的数字开始的偏移量(-2,147,483,648)。如果您尝试存储太小的数字(下溢),也会发生同样的情况,一旦低于最低数字,它将变为正值。
在您的情况下,您至少需要一个无符号整数,并且要存储更大的数字,您有 long int
、long long int
和 unsigned long long int