《算法笔记》 5.4.1 节——素数的判断

《算法笔记》 5.4.1 节——素数的判断

素数的定义:

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

我们可以理解为一个整数 n 需要被判定为素数,需要判断 n 能否被 2 , 3 ⋯ ( n − 1 ) 2,3\cdots (n-1) 2,3(n1)中的一个整除。

都不能整除的数即可判定为素数。

但这种方法的时间复杂度为 O ( n ) O(n) O(n),在许多题目中,判断素数只是题目的一部分,如此的时间复杂度

实际上对程序可通过性影响很大,需要更加快速的判定方法。

改进:

我们假设在 2 2 2 ~ n − 1 n-1 n1中存在 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,3sqrt(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} 231~ 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>​头文件中,使用前记得导入:)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值