原理可以百度,维基
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<vector>
#include<algorithm>
#define ll long long
using namespace std;
const ll maxn = 10000007+10;
const ll maxp = 700000;
int vis[maxn];//i是合数vis为1,i是素数,vis为0
ll prime[maxp];
inline void sieve(ll n){
ll m=(ll)sqrt(n+0.5);
memset(vis,0,sizeof(vis)); //初始化全为素数
vis[2]=0;//2为第一个素数
for(ll i=3;i<=m;i=i+2){
if(!vis[i])
for(ll j=i*i;j<=n;j+=i)
vis[j]=1;
if(i*i>n)
break;
}
}
ll gen(ll n){
sieve(n);
ll c=1;//统计素数的个数
prime[0]=2;
for(ll i=3;i<=n;i=i+2)
if(!vis[i])
prime[c++]=i;
return c;
}
int main()
{
ll n,c;
cout<<"刷素数到n:";
cin>>n;
c=gen(n);
for(ll i=0;i<c;i++)
printf("%lld ",prime[i]);
cout<<endl<<c;
return 0;
}