C++ Erastothenes筛

C++ Erastothenes筛,c++,algorithm,primes,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]=t

我正在解决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;
我明白,在这种情况下,我们试图知道这个数是否为素数,但我不明白为什么我们跳非素数


任何帮助都会对我有用,谢谢你的效率。让我们看看复合数字4。我们真的需要检查所有其他数字的可分性吗?不,因为我们已经检查了它的主要因素


简而言之,检查复合数是一个冗余过程,因为我们检查它的素因子。

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


简而言之,检查复合数是一个冗余的过程,因为我们检查它的素数因子。

素数是一个除了1和自身之外没有除数的数

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

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

2是素数吗?对 标记所有2*x,其中x 是3素数吗?对标记所有3*x->3,6,9等

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


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

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

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

2是素数吗?对 标记所有2*x,其中x 是3素数吗?对标记所有3*x->3,6,9等

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


这就是筛子的工作原理。首先假设所有数字都是素数。然后,对于每个素数(从2开始并向上),您丢弃(“筛选出”,因此“筛选”)其倍数的所有数字。因此,条件及其保护的循环意味着:“如果
i
为素数,则将
i
的所有倍数标记为非素数”。用纸和笔试一下,比如说,20。这就是筛子的工作原理。首先假设所有数字都是素数。然后,对于每个素数(从2开始并向上),您丢弃(“筛选出”,因此“筛选”)其倍数的所有数字。因此,条件及其保护的循环意味着:“如果
i
为素数,则将
i
的所有倍数标记为非素数”。非常感谢,这是最后一句话,它解释了我搜索的内容非常感谢,这是最后一句话,它解释了我搜索的内容你就像你的伪品一样棒,谢谢你,继续帮助别人你就像你的伪品一样棒,谢谢你,继续帮助别人
int main()
{
    int n = 70;
    sieve_of_eratosthenes(n);
}