【C++算法模板】数论:欧拉筛,线性查找质数的算法

文章目录

1)传统找质数的方法(优化筛选次数)

c 复制代码
bool isPrime(int num) {
    for(int i=2;i<=sqrt(num)) {
        if(num%i==0)
            return false;
    }
    return true;
}
  • 如果要找从 [ 1 , 1 e 6 ] [1,1e6] [1,1e6] 中的所有质数,时间复杂度很高

2)欧拉筛

  • 算法思想:遍历到 2 2 2 的时候,筛掉范围内所有 2 2 2 的倍数(因为除了 1 1 1 和自身以外,一定能被 2 2 2 整除),到 3 3 3 的时候,筛掉所有 3 3 3 的倍数···
  • 注意:如果计算 [ l , r ] [l,r] [l,r] 之间出现的质数的个数?可以用前缀和的思想;当 n n n 过大时, i × i i×i i×i 容易出现数组越界的错误,即可能 R u n t i m e E r r o r RuntimeError RuntimeError ,此时要将线性筛中第二个 f o r for for 中的 j = i × i j=i×i j=i×i 改为 j = i + i j=i+i j=i+i
c 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int f[N]; // 下标为i时,记录1~i出现的所有质数的数量
bool vis[N]; // 是否已经访问过
int p[N]; // 用于存放素数
int idx,n; // idx是存放素数的遍历因子
void get_primes(int n)
{
	f[1]=0;
	for(int i=2;i<=n;i++)
	{
		// 如果vis[i]为false才需要遍历
		if(!vis[i]){
			f[i]=f[i-1]+1; // 计算前缀和
			p[++idx]=i; // 是素数,存起来
            // 如果出现RuntimeError,将j=i+i,这样就不会数组越界
			for(int j=i*i;j<=n;j+=i) // 将素数i的倍数全部标记为合数,则无需遍历
				vis[j]=true;
		} else 
			f[i]=f[i-1]; // 向下传递素数个数
	}
}

int main()
{
	// 如:输入1000即打印0~1000以内的素数
	cin>>n;  
	int l,r; // 左右区间
	cin>>l>>r;
	get_primes(n);
	cout<<"1~"<<n<<"之间的素数分别是:";
	for(int i=1;i<=idx;i++) {
		cout<<p[i];
		if(i!=idx)
			cout<<",";
	}
	cout<<endl;
	cout<<l<<"~"<<r<<"所出现的素数个数为:"<<f[r]-f[l-1]<<endl;
	return 0;
}
  • 最简单的模板
c 复制代码
const int N=5e4+5; // 注意这里没有开到2^9,只要比sqrt(2^9)大即可
int primes[N],cnt;
bool st[N];
int ans[N],len;

// 线性筛模板
void get_primes(int n) {
	for(int i=2;i<=n;i++) {
		if(!st[i]) primes[cnt++]=i;
		for(int j=0;primes[j]*i<=n;j++) {
			st[primes[j]*i]=true;
			if(i%primes[j]==0) break;
		}
	}
}

// 为什么特判x>=N的情况?因为为了节省内存或者没必要,本题中只要保证MAXN比sqrt(理论最大值)大即可
bool is_prime(int x) {
	if(x<N) return !st[x];
	for(int i=0;primes[i]<=x/primes[i];i++)
		if(x%primes[i]==0)
			return false;
	return true;
}
相关推荐
Coovally AI模型快速验证6 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
mit6.8246 小时前
[openvela] Hello World :从零开始的完整实践与问题复盘
c++·嵌入式硬件
pusue_the_sun6 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao346 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
zhangfeng11337 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
啊阿狸不会拉杆7 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路8 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法
曙曙学编程9 小时前
stm32——GPIO
c语言·c++·stm32·单片机·嵌入式硬件
你知道网上冲浪吗9 小时前
【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架
python·算法·数学建模·数值分析
△曉風殘月〆9 小时前
Visual Studio中的常用调试功能(下)
c++·ide·visual studio·调试