学了一个下午
超级普通筛
#include<iostream>
#include<cmath>
using namespace std;
bool prime(int a){
if(a==1||a==0) return 0;
if(a==2) return 1;
for(int i=2;i<=sqrt(a);i++){
if(a%i==0)return 0;
}
return 1;
}
int main(){
//超级普通筛法
int n;
cin >> n;
for(int i=1;i<=n;i++){
if(prime(i)){
cout<<i<<endl;
}
}
return 0;
}
埃氏筛(普通筛)
#include<iostream>
using namespace std;
bool pd[(int)1e8];
//false 表示了是质数 , true 表示了不是质数
int main(){
//埃氏筛
int n,ans=0;//ans表示区间质数个数
cin >> n;
for(int i=2;i<=n;i++){
if(pd[i]==false){
ans++;
cout<<i<<endl;
//标记(相比欧拉筛,就可能重复标记) 时间复杂度接近线性 但不是
for(int k=i+i;k<=n;k+=i){
pd[k]=true;
}
}
}
cout<<"质数个数有"<<ans<<"个";
return 0;
}
欧拉筛(线性筛)
#include<iostream>
using namespace std;
#define maxn 5800000
//1e8以内的大概5700000个质数左右
int zhishu[maxn];
bool pd[(int)1e8];
//科普 nem 的表示方法表示 n* 10的m次方 的
//例如1e8表示1*10^8 , 5e6 表示5*10^6
//false 表示了是质数 , true 表示了不是质数
int main(){
//线性筛(欧拉筛)
int n,ans=0;//ans表示区间质数个数
cin >> n;
for(int i=2;i<=n;i++){
if(pd[i]==false){
//进质数
zhishu[++ans]=i;
cout<<i<<endl;
}
for(int j=1;j<=ans&&zhishu[j]*i<=n;j++){//注意边界条件
pd[ zhishu[j] * i ]=true;
if(i % zhishu[j] == 0) break;//一定要放后面 ,否则2%2==0错了,后面的4也就错了
}
}
cout<<"一共有"<<ans<<"个质数";
return 0;
}