朴素算法
在学会判断质数之前,我们要先知道质数的定义。质数是只能被1和本身整除的数。也就是说,一个质数除了1和它本身,没有其他因子。
给你一个数 n n n,如何判断 n n n是不是质数呢?
因为质数只能被1和本身整除,所以我们可以从 2 2 2枚举到 n − 1 n-1 n−1。若有一个数能整除 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;
}