为什么我的埃拉托色尼代码筛子无限循环.我已经用几个数字进行了测试

Why is my sieve of Eratosthenes code looping infinitely. I have tested with a few numbers

本文关键字:几个 数字 测试 埃拉托 我的 代码 无限循环 为什么      更新时间:2023-10-16

我正在尝试从下面的伪代码中实现C++的埃拉托色尼算法的筛子:

输入:整数 n> 1。

设 A 是一个布尔值数组,由整数 2 到 n 索引, 最初全部设置为 True。

对于 i = 2, 3, 4, ...,不超过 √n: 如果 A[i] 为真: 对于 j = i2, i2+i, i2+2i, i2+3i, ..., 不超过 n: A[j] := 假。

输出:所有 i 使得 A[i] 为真。

但是,我的代码在最后一个 for 循环中无限循环,我不知道为什么。

void primes(int n)
{
    bool numArr[n];
    for (int a=2;a<n;a++)
       {
           numArr[a]=true;
       }
    int   k,j, m = int(sqrt(n));
    for(int i=2;i<m;i++)
    {
        k=0;
        if(numArr[i]==true)
        {
            for(j=i^2;j<n;j+(k*i))
            {
                numArr[j]=false;
                k++;
            }
        }
    }
    for(int j=1;j<n;j++)
    {
        if(numArr[j]==true)
        {
            cout<<numArr[j]<<endl;
        }
    }
}

首先,C++中没有VLA。然而,一些编译器会容忍它们,而另一些则不会。对于便携式解决方案,std::vector效果很好。将您的 VLA 替换为以下内容:

std::vector<bool> numArr(n);

您甚至可以将初始化放入其中。不需要将所有内容设置为true的循环,只需将numArr(n)更改为numArr(n, true),一切都为您完成。

但是,您的主要问题就在这里:

for(j=i^2;j<n;j+(k*i))

j=i^2不会做你认为它做的事情,你的j+(k*i)增量不会增加任何东西。实际上,k部分毫无意义。请改为执行以下操作:

for (j = i*i; j < n; j += i)

你的cout<<numArr[j]<<endl;印刷品也是错误的。 numArr[j]bool,所以每次都会打印1。当然,您想打印j而不是numArr[j].

虽然这不是问题,但您不必写if (numArr[i] == true).只是做if (numArr[i])numArr[i]已经是bool了.