为什么从当前素数的平方开始第二个埃拉托色尼筛法循环?

问题描述

vector<bool>vc(100006,1);
void seive(int n)
{
    vc[0]=vc[1]=0;
    int i,j;
    for(i=2;i*i<=n;i++)
    {
        if(vc[i]==1)
        {
            for(j=i*i;j<=n;j=j+i)
            {
                vc[j]=0;
            }
        }
    }

}

我的问题是为什么第二个循环从 i 的平方开始。当前素数(i)的平方之前的倍数是如何被标记的?实际上我们如何确定它?

解决方法

如果我们已经标记了对应于 3*5 的条目,那么标记对应于 5*3 的条目就没有意义了。

所以我们从 5*5 开始——就像我们之前从 3*3 开始一样,并且确实在 3*5 = 3*3+3+3 的循环过程中标记了 i=3 条目}}。

概括这个论点可以回答你的问题。