素数筛(欧拉筛算法)
#include<bits/stdc++.h>
using namespace std;
#define maxn 100000
int vis[maxn];
int prime[maxn];
//欧拉筛函数
int Euler_sieve(int n)
{
int i,j,k;
k=0;//保存素数的个数
memset(vis,0,sizeof(int)*maxn);//初始化数组
for(i=2;i<=n;i++)
{
if(vis[i]==0)//i是素数,则存起来
prime[k++]=i;
for(j=0;j<k;j++)//进行倍增,用i去乘以i之前(包括i)的素数
{
if(i*prime[j]>n)//倍增结果超出范围,退出
break;
vis[ i*prime[j] ]=1;//将倍增结果进行标记
if(i%prime[j]==0)//i是前面某个素数的倍数时,也需要退出,能大大提升时间效率
break;
}
}
return k;
}
int main(){
int n;
cin>>n;
int len=Euler_sieve(n);
for(int i=0;i<len;i++){
cout<<prime[i]<<endl;
}
return 0;
}