Eratosthenes的筛子C ++无限循环

时间:2015-10-15 20:45:50

标签: c++ visual-studio sieve-of-eratosthenes

所以,我一直在解决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进行测试。

1 个答案:

答案 0 :(得分:2)

因此,在修复第一个循环起点后,问题就出现了下一个循环。

因为下一个循环始终从0开始并查找下一个素数,所以它总是会找到2,这将导致无限循环。

要解决此问题,请从上一个值开始搜索下一个素数:

    for(int i = p + 1; i <= n; ++i)