问题描述
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
条目}}。
概括这个论点可以回答你的问题。