埃氏筛,时间复杂度O(nloglogn); #include <iostream> #include<algorithm> #include<utility> #include<cstring> using namespace std; typedef long long ll; bool number[100]; int n; void getprime() { memset(number,true,sizeof(number)); for(int i=2;i<=n;i++) { if(number[i]) { for(int j=2;i*j<=n;j++) number[i*j]=false; } } } int main() { cin>>n; getprime(); for(int i=2;i<=n;i++) { if(number[i]) cout<<i<<" "; } return 0; } 线性筛,时间复杂度O(n);核心:每个合数用最小质数筛选一次。 #include<iostream> #include<cstring> using namespace std; bool number[100]; int n,prime[100]; void get_prime() { int cnt=0; memset(number,true,sizeof(number)); for(int i=2;i<=n;i++) { if(number[i]) prime[++cnt]=i; for(int j=1;j<=cnt&&i*prime[j]<=n;j++) { number[prime[j]*i]=false; if(i%prime[j]==0) break; } } } int main() { cin>>n; get_prime(); for(int i=2;i<=n;i++) { if(number[i]) cout<<i<<" "; } return 0; }