算法竞赛之质数问题

本文探讨了算法竞赛中质数的判定和分解质因数的方法,包括暴力算法和改进算法,如基于质数模6余数的优化。同时介绍了不同质数筛法的时间复杂度,如普通筛法、埃氏筛法和线性筛法(欧拉筛法),重点讨论了如何减少重复筛选以提升效率。
摘要由CSDN通过智能技术生成

算法竞赛之质数问题

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

算术基本定理

唯一分解定理又叫算术基本定理,可表述为:任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积N=P1^a1 * P2^a2 * P3^ a3 … Pn^ an,这里P1<P2<P3…<Pn均为质数,其中指数ai是正整数。这样的分解称为 N 的标准分解式。

1、质数的判定

1.1 暴力算法
bool is_prime(int n)
{
   
	if(n<2) return false;
	for(int i = 2; i < n; i ++)
		if(n % i == 0)
			return false;
	return true;
}

时间复杂度 O(n)

1.2 改进算法

原理:若正整数n(n>=2)有因数,则当因数个数为偶数时:因数成对存在,且每一对因数分居根号n两侧。反之当因数个数为奇数时:n为完全平方数且除了根号n以外,因数成对存在,且每一对因数分居根号n两侧。

bool is_prime(int n)
{
   
	if(n < 2) return false;
	for(int i = 2; i <= n / i; i ++)
		if(n % i == 0)
			return false;
	return true;
}

时间复杂度 O(sqrt(n))
小细节:

  • 代码第四行中的 i <= n / i 是推荐的写法
  • 若写成 i <= sqrt(n) 耗时会提高
  • 若写成 i * i <= n 可能会造成溢出问题
1.3 改进算法(*)

原理:任意质数(除了2、3)模6,余数一定是1或5。
证明(反证法):若数字n模6为0,则n=6k,不符合;若若数字n模6为2,则n = 6k + 2 = (3k + 1)* 2,不符合;以此类推。
方法:判断模6余数,筛除模6不余1和5的数,剩余数为6k + 5和6k + 7。由于模2、3、4、6均有余数,那么模6k + 2、6k + 3、6k + 4、6k + 6也有余数,则只需要考虑模6k + 5与6k + 7。

bool is_prime(int
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值