【发布时间】:2021-01-24 20:36:59
【问题描述】:
所以当我运行这段代码时:
#include <iostream>
using namespace std;
#include <vector>
#include <string>
int main()
{
int current_number = 0;
vector<int>primes;
for(int i = 0; i < 100; i++)
{
current_number++;
for(int h= 0; h < primes.size(); h++)
{
if(current_number % primes[h] == 0)
{
continue;
}
else
{
primes.push_back(current_number);
}
}
}
for(int x =0; x < 100; x++)
{
cout << primes[x];
}
}
我遇到了分段错误。我很确定它与vectorprimes有关。但是,我不确定到底是什么。代码的目的是找出 1 到 100 之间的每个素数。
【问题讨论】:
-
您是否注意到内部 for 循环体从未执行,因为
primes在开始时为空且从未更改?例如。h < primes.size()在没有进入循环体的情况下在初始和抛弃时是错误的。这段代码最终所做的就是将计数器递增 100 次,然后执行一个硬 100 次迭代循环,该循环取消引用primes中不存在的单元格。 使用调试器。单步执行此代码会快速向您展示这一点。 -
当我这样做时:vector
primes = {2};,因此 primes 在开始时不为空,代码什么也不做。这就是我最初所做的,但我明白你的意思。 -
一旦你这样做了,它仍然会被破坏,因为模数非零的每次迭代都会增加
primes(从而拉长内部循环)。在 after 内部循环完成之前,您不想这样做,并且知道它在没有零模测试命中的情况下运行完成;不是每次失败的命中。仅供参考,代码中的最后一个循环应该是for (auto x : primes) { std::cout << x << ' '; } -
啊,我明白了,谢谢。
-
for(int x =0; x < 100; x++)不够谨慎。我更喜欢for(unsigned x = 0; x < primes.size(); x++),然后我确定我不会在循环内超出primes。当然for (auto value: primes)在这里会更好。