所以,我一直在解决Bjarne Stroustrup的编程问题:使用C ++的原理和实践为了我自己的利益,这个问题让我困扰了几天。
我应该用第4章学到的工具实现经典的Eratosthenes算法筛选(这不是很多),这是我到目前为止所做的:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main()
{
int p = 2;
int n = 0;
vector<int> nums{ 1, 1 };
cout << "Enter an integer greater than 1:\n";
cin >> n;
for (int i = 2; i <= n; ++i)
nums.push_back(0);
while (p < sqrt(n))
{
for (int i = 2; (i*p) <= n; ++i)
{
nums[i*p] = 1;
}
for (int i = (p+1); i <= n; ++i)
{
if (nums[i] == 0)
{
p = i;
break;
}
}
}
for (int i = 0; i <= n; ++i)
{
if (nums[i] == 0)
cout << i << '\n';
}
return 0;
}
此代码是SOOO接近工作但没有雪茄。它只打印5之后的素数,它不会打印2或3.我知道问题是由于我的标记循环是标记nums [2]和nums [3],所以我试图添加以下代码行确保2和3没有标记,因为它们被用作p起始值:
nums[p] = 0;
我将该行放在嵌套在while循环中的两个for循环之间。我不知道怎么样,但是这会导致无限循环,我已经尝试了几个小时来修复。我真的在这里结束了。
注意:我一直在用n = 23进行测试。
答案 0 :(得分:2)
因此,在修复第一个循环起点后,问题就出现了下一个循环。
因为下一个循环始终从0
开始并查找下一个素数,所以它总是会找到2
,这将导致无限循环。
要解决此问题,请从上一个值开始搜索下一个素数:
for(int i = p + 1; i <= n; ++i)