筛选的思想:对于不超过n的每个数p,删除2p,3p,4p....当处理完所有数后,还没有被删除的数就是素数。
比如要筛选区间(n,m)的无平方因子数,对于不超过根号m的所有素数p,筛掉区间(n,m)内p²的所有倍数。
首先来找素数,vis[i]表示被删除的数,vis[i]=1表示已经被删除。
筛选方法为:
int n,m,c=0;
scanf("%d %d",&n,&m);
int s=sqrt(m+0.5);
memset(vis,0,sizeof(vis));
for(int i=2;i<=s;i++)
if(!vis[i]){
prime[c++]=i;
for(int j=i*i;j<=n;j+=i){
vis[j]=1;
}
}
再来把(n,m)中间的带平方因子的数删掉,并把不带平方因子的数输出。
memset(vis,0,sizeof(vis));
for(int i=0;i<c;i++)
for(int j=prime[i]*prime[i];j<=m;j+=prime[i]*prime[i])
vis[j]=1;
for(int i=n;i<=m;i++)
if(!vis[i]) printf("%d ",i);