你不知道的几种素数判断方法,由浅入深,详解。(附送程序员必读好书)

对你有帮助别忘了给我点个赞哦~

 

将近50本能让程序员进入大厂应该精读的神书,免费 送给大家!只需要关注文章底下的公众号即可获得

 

我们要判断素数,首先要知道素数的定义。

素数:质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。

知道了素数的定义,那么我们应该想一下,如何去判断一个数是否为素数?

一种思路是,我们在每次得到一个数后,都去计算,去尝试因式分解它,看它除了1和自身之外还有没有其他因子
另一种是,我们去查阅素数表,看这个数在不在素数表上。那我们就要先得到素数表。

以下除了第一种方法,第2~4种方法都是用第二种思路做的
当要判断的目标数很少时,第一种高效。但是当给定的目标数组很多,数也很大时。后面的思路配上高效的查找算法,显然更高效


方法1:暴力求解

1-1:稍微动动脑

思想
根据素数的定义思考。素数是大于1的自然数,除了1和自身外,其他数都不是它的因子。
那我们就可以用一个循环,从2开始遍历到这个数减去1,如果这个数都不能被整除,那么这个数就是素数。
也就是说:
给定一个数 n , i 从 2 开始取值,直到 n - 1(取整数),如果 n  %  i != 0 , n 就是素数
进一步思考,有必要遍历到 n - 1 吗?
除了1以外,任何合数最小的因子就是2,那最大的因子就是 n/2
那我们就遍历到 n/2就足够了

这样我们就可以写出这个算法的核心代码:

int isPrime(int target) {

    int i = 0;

    if (target <= 1) {
        printf("illegal input!\n");//素数定义
        return -1;
    }

    for (i = 2; i <= target / 2; i++) {
        if (target % i == 0)
            return 0;//不是素数直接返回0
    }

    return 1;//是素数返回1
}

1-2:再进一步

思想

在上面的基础上,其实不需要遍历到 n/2,只需要到 根号n(包含根号n) 就可以了。为什么呢?这是个数学问题,大家自行思考一下。

核心代码:

int isPrime(int target) {

    int i = 0;

    if (target <= 1) {
        printf("illegal input!\n");//素数定义
        return -1;
    }

    for (i = 2; i &
  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值