埃拉斯托特尼筛子

Sieve of Erastothenes

本文关键字:埃拉斯      更新时间:2023-10-16

我正在解决欧拉项目中的一些编程问题,在这个问题中停了下来:

生成素数

我理解了算法,但我不理解解决方案中的一件事:

这是我从另一个讨论中得到的解决方案:

void sieve_of_eratosthenes(int n)
{
    bool *sieve = new bool[n+1];
// Initialize
sieve[0]=false;
sieve[1]=false;
sieve[2]=true;
for(int i=3;i<n+1;++i)
    sieve[i]=true;
// Actual sieve
for(int i=1; i<n+1; ++i)
    //**i didnt understood what is the purpose of this condition**
    if(sieve[i]==true)
        for(int j=2;j*i<n+1;++j)
            sieve[j*i]=false;
// Output
cout << "Prime numbers are: " <<endl;
for(int i=0;i<n+1;++i)
    if (sieve[i])
        cout << i <<endl;
delete [] sieve;

}

int main()
{
    int n = 70;
    sieve_of_eratosthenes(n);
}

我明白,在这种情况下,我们试图知道数字是否是素数,但我不明白为什么我们跳过非素数

任何帮助都会对我有用,谢谢你

效率。让我们看一下合数4。我们真的需要检查所有其他数的可整除性吗?不,因为我们已经检查过它的质因数了。

简而言之,检查合数是一个多余的过程,因为我们检查了它的质因数。

素数是除了1和它自己之外没有因数的数。

筛选的目的是将质数的所有倍数标记为非质数。为此,我们检查该数是否为素数,并将所有是该素数的倍数的数标记为非素数。

为了更形象一点。我们从第二条开始。

2是素数吗?是的。标记所有2*x,其中x

3是素数吗?是的。标记所有3*x -> 3,6,9等

4是素数吗?不。如果我们没有这种情况,我们就会标记4、8、16等不是素数,但我们已经用2做过了。