#include<bits/stdc++.h> #define maxn 100000010 using namespace std; int x; int cnt,isprime[maxn],mindiv[maxn]; bool notprime[maxn]; void shai(int n){ for(int i=2;i<=n;i++){ if(notprime[i]==0){ isprime[++cnt]=i; mindiv[i]=i;//最小质因子,用来标记n } for(int j=1;(j<=cnt)&&(i*isprime[j]<=n);j++) { notprime[i*isprime[j]]=true;
mindiv[i*isprime[j]]=i; if(!i%isprime[j]) break;//质数再大一点就超了,mindiv[i]就不是最小质因子了 } } } int main(){ cin>>x; shai(x); for(int i=1;i<=cnt;i++) cout<<isprime[i]<<" "; // cout<<cnt; cout<<endl; return 0; }
另一种简单一点的写法:
void shai2(int n){ for(int i=2;i<=n;i++){ if(notprime[i]==0){ isprime[++cnt]=i; } for(int j=1,t;(j<=cnt)&&((t=i*isprime[j])<=n);j++) { notprime[t]=true; if(!i%isprime[j]) break; } } }