《算法笔记》 5.4.1 节——素数的判断
素数的定义:
素数一般指质数。质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
我们可以理解为一个整数 n 需要被判定为素数,需要判断 n 能否被 2 , 3 ⋯ ( n − 1 ) 2,3\cdots (n-1) 2,3⋯(n−1)中的一个整除。
都不能整除的数即可判定为素数。
但这种方法的时间复杂度为 O ( n ) O(n) O(n),在许多题目中,判断素数只是题目的一部分,如此的时间复杂度
实际上对程序可通过性影响很大,需要更加快速的判定方法。
改进:
我们假设在 2 2 2 ~ n − 1 n-1 n−1中存在 n 的约数 k,即 n % k = = 0 n \% k==0 n%k==0,那么由 k ∗ ( n / k ) = = n k*(n/k)==n k∗(n/k)==n可知, n / k n/k n/k
也是 n 的一个约数,且 k k k 与 n / k n/k n/k中一定满足其中一个小于 s q r t ( n ) sqrt(n) sqrt(n) 一个大于 s q r t ( n ) sqrt(n) sqrt(n)。
由此我们可知,在判断素数时,只需判断 n 能否被 2 , 3 ⋯ s q r t ( n ) 2,3\cdots sqrt(n) 2,3⋯sqrt(n) 中某一个整除即可( s q r t ( n ) sqrt(n) sqrt(n)向下取整)
代码实现:
int IsPrime(int n)
{
if (n <= 1) return 0;
int sqr = (int)sqrt(1.0 * n);
for (int i = 2; i < sqr; ++i)
{
if (n % i == 0) return 0;
}
return 1;//C语言中的 1代表true 0代表false
}
如果 n 没有接近 int型变量的范围 ( ( ( 2 − 31 2^{-31} 2−31~ 2 31 2^{31} 231 ) ) )上界,可以有更简单的写法:
int IsPrime(int n)
{
if (n <= 1) return false;
for (int i = 2; i*i <= n; ++i)
{
if (n % i == 0) return 0;
}
return 1;//C语言中的 1代表true 0代表false
}
此上代码中的 s q r t ( ) sqrt() sqrt()函数在< m a t h . h math.h math.h>头文件中,使用前记得导入:)