埃式筛法
#include <bits/stdc++.h>
using namespace std;
bool vis[100000010]; //标记数组
int n;
int main(){scanf("%d",&n);vis[0]=vis[1]=1;for(int i=2;i*i<=n;i++){ //优化1 if(vis[i]!=1){for(int j=i*i;j<=n;j+=i){ //优化2 vis[j]=1; //0是质数,1不是 }}}for(int i=2;i<=n;i++){if(vis[i]==0){cout<<i<<" ";}}return 0;
}
欧拉筛
#include <bits/stdc++.h>
using namespace std;
bool vis[100000010];
int n,cnt=0,prime[10000000];
int main(){scanf("%d",&n);vis[0]=vis[1]=1;for(int i=2;i<=n;i++){if(!vis[i]){prime[++cnt]=i;}for(int j=1;j<=cnt&&i*prime[j]<=n;j++){vis[i*prime[j]]=1;if(i%prime[j]==0){break;}}}for(int i=1;i<=n;i++){if(prime[i]==0)break;printf("%d ",prime[i]);}return 0;
}