三种质数筛

学了一个下午

超级普通筛

#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;
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值