Eratosthenes的筛子

时间:2014-08-24 13:57:50

标签: c++ algorithm primes

我正在解决euler项目中的一些编程问题,并且我已经解决了这个问题:

生成素数

我理解算法,但我在解决方案中没有理解一件事:

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

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);
}

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

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

2 个答案:

答案 0 :(得分:2)

效率。让我们看看复合数字4.我们真的需要检查所有其他数字的可分性吗?不,因为我们已经检查了它的主要因素。

简而言之,检查复合数是一个多余的过程,因为我们检查其主要因素。

答案 1 :(得分:2)

素数是除了1和它本身之外没有除数的数字。

筛子的目的是将素数的所有倍数标记为不是素数。 为此,我们检查数字是否为素数,并将所有数字的数字标记为非素数。

稍微想象一下。假设我们从2号开始。

  

2素数?是。   标记所有2 * x,其中x < ñ。这标志着2,4,6,8   等

     

3素数?是。标记所有3 * x - &gt; 3,6,9等。

     

4素数?不,如果我们没有这个条件,我们会标记   4,8,16等不是素数,但我们已经用2完成了这个。