质数的判断

朴素算法

在学会判断质数之前,我们要先知道质数的定义。质数是只能被1和本身整除的数。也就是说,一个质数除了1和它本身,没有其他因子。

给你一个数 n n n,如何判断 n n n是不是质数呢?

因为质数只能被1和本身整除,所以我们可以从 2 2 2枚举到 n − 1 n-1 n1。若有一个数能整除 n n n,则 n n n是合数;否则, n n n是质数。

code

bool pd_prime(int n){
	for(int i=2;i<n;i++){
		if(n%i==0) return 0;
	}
	return 1;
}

时间复杂度为 O ( n ) O(n) O(n),显然有点慢,我们考虑优化一下。


优化

首先,我们知道,一个数可以拆分为若干个质因子的乘积。我们可以推出一个数 n n n最多只会有一个大于 n \sqrt n n 的质因数。为什么呢?如果 n n n有两个质因子 a , b a,b a,b都大于 n \sqrt n n ,那么 n n n一定是 a × b a\times b a×b的倍数。又因为 a × b > n a\times b>n a×b>n,所以不可能有两个及以上的大于 n \sqrt n n 的质因数。

n n n为合数,如果它有大于 n \sqrt n n 的质因子 a a a,那么他也一定有一个因子为 n a \dfrac na an。因为 n n n为合数,而 a a a为质因子,所以 n ≠ a n\neq a n=a n a ≠ 1 \dfrac na\neq 1 an=1。若它没有大于 n \sqrt n n 的因子,则它一定有小于 n \sqrt n n 且不为1的因子。

n n n为质数,则 n n n没有小于 n n n且不为1的因子,即 n \sqrt n n 没有小于 n n n且不为1的因子。

由此可得,我们只需枚举 1 1 1 n \sqrt n n 之间的数。若有数能整除 n n n,则 n n n为合数;否则 n n n为质数。

code

bool pd_prime(int n){
	for(int i=2;i*i<=n;i++){
		if(n%i==0) return 0;
	}
	return 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值