基本思想:
范围1-n。从素数2开始,将2的所有的倍数(自身不包括)筛去;再选择下一个没有被筛去的素数,例如3,同理将3的所有倍数筛去;接下来是5,以此类推直到筛选完成。
示例代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[n+1];
for(int i=0;i<=n;i++){
a[i]=i;
}
for(int i=2;i*i<=n;i++){
int k=i;//可以判断一下是否被筛选过
for(int j=i*i;j<=n;j=i*k){
a[j]=0;
k++;
}
}
for(int i=2;i<=n;i++){
if(a[i]!=0)
cout<<a[i]<<" ";}
}
解释:
外层循环中选择了数i,需要在内层排除i的所有的倍数(i*k,k=1,2,3...),但是选择i*i开始是因为那些k<i的i的倍数之前都已经筛选过了,例如i*(i-1)这个数在外层选择i-1时已经筛选过了。因此跳过i*i之前的数,按照i*i,i*(i+1),i*(i+2)...筛选;
内层以i*i开始筛选,则外层循环终止条件自然是i*i<=n;