质数判断与欧拉筛(线性筛)

质数定义

质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

在整个自然数集合中,质数的数量不多,分布比较稀疏,对于一个足够大的整数N,不超过N 的质数大约有N/lnN个,即每lnN个数中大约有1个质数。

质数的判定

试除法

概述

我们只需要扫描2~sqrt(N)之间的所有整数,依次检查它们是否能整除N,需要特判0与1两个整数
该算法时间复杂度为O(sqrt(N))

模板代码
bool isPrime(int n){
	if(n<2)	return 0;
	for(int i=2;i<=sqrt(n);i++){
		if(n%i==0)	return 0;
	}
	return 1;
}

质数的筛选

埃氏筛

由于其时间复杂度并非最小,在此不做介绍

欧拉筛(线性筛法)

概述

线性筛法通过“从大到小累积质因子”的方式标记每个合数

模板代码
int n,Prime[100010],cnt;
bool isPrime[100010];
void check(){
	memset(isPrime,1,sizeof(isPrime));
	isPrime[1]=0;
	for(int i=2;i<=n;i++){
		if(isPrime[i])	Prime[++cnt]=i;
		for(int j=1;j<=cnt&&i*Prime[j]<=n;j++){
			isPrime[i*Prime[j]]=0;
			if(!i%Prime[j])	break;
		}
	}
}

例题

P1304 哥德巴赫猜想
P1075 [NOIP2012 普及组] 质因数分解
P1579 哥德巴赫猜想(升级版)
P1036 [NOIP2002 普及组] 选数
P2626 斐波那契数列(升级版)



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   Nebulary  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示