Java中判断一个数是否为素数(质数)的方法实例

 更新时间:2026年01月11日 15:45:07   作者:阳雨i  
在Java编程语言中判断一个整数是否为质数是一个常见的数学问题,也是计算机科学基础课程中的典型示例,这篇文章主要介绍了Java中判断一个数是否为素数(质数)的相关资料,需要的朋友可以参考下

素数的定义

素数是指大于1的自然数,除了1和它本身外,没有其他正因数。换句话说,素数只能被1和它自身整除。

素数的例子

常见的素数包括2、3、5、7、11、13等。2是唯一的偶数素数,其他偶数(如4、6、8等)均不是素数,因为它们可以被2整除。

素数的性质

  • 唯一分解定理:任何大于1的自然数都可以唯一地分解为素数的乘积。
  • 无限性:素数有无限多个,这一结论最早由欧几里得证明。
  • 分布规律:素数在自然数中的分布不均匀,但随着数值增大,素数出现的频率逐渐降低(素数定理)。

判断素数的方法

试除法:根据上面对素数性质的理解,我们可以联想到最简单的判断方式,就是一个数,从1开始往后一个数一个数的去做除法,直到它本身,如果都没有能被除尽(没有余数),则这个数就是素数

public static boolean isPrime(int n) {//n表示传入需要判断的数
    if (n <= 1) {//如果小于1不是素数,直接返回
        return false;
    }
    for (int i = 2; i < n; i++) {//从除数2开始往后除,一直到n本身
        if (n % i == 0) {//如果n能被i整除(无余数),则这个数不是素数
            return false;
        }
    }
    //当所有的数字都除完了,没有一个i能整除n,则是素数
    return true;
}
 

通过上面的代码可以做到素数的判断,但是这样的判断效率非常的慢,如果需要判断的素数非常的大,一个一个的从1开始除,则需要浪费很多时间,我们可以引入一个变量count来计数一下,总共

进行了多少次循环

public static boolean isPrime(int n) {
    if (n <= 1) {
        return false;
    }
    int count = 0;  // 初始化计数器
    for (int i = 2; i < n; i++) {
        count++;     // 每次循环递增计数器
        if (n % i == 0) {
            System.out.println("count: " + count);  // 输出循环次数
            return false;
        }
    }
    System.out.println("count: " + count);  // 输出循环次数
    return true;
}
 

例如我们需要判断52087这个数字是否为素数,可以看到count如下:

count: 50285

可以看到需要循环的次数非常的多,那么我们有没有可以进行优化的方法呢?

有的兄弟,有的

方法优化

上述方法可以进一步优化,减少循环次数:

public static boolean isPrime(int n) {
        int count = 0;
        for (int i = 2; i <= Math.sqrt(n) ; i++) {//Math.sqrt(n)指的是n开根号
            count++;
            if (n % i == 0) {
                return false;
            }
        }
        System.out.println(count);
        return true;

在这个方法中,我们可以看到在for循环中除数的结束循环发生了变化,在上一个方法中结束的条件是循环到判断数n本身的位置,在这个方法中则是变成了√n,这个怎么去理解呢?

我们可以观察上图,四个数中的因子,都是成对出现的,我们以36为例子,36的平方根是6

我们可以发现,左边绿色部分的数,都是小于平方根的,右边蓝色部分的数都是大于平方根的,平方根把因子平均分为了两组,且两组都是一一对应的,那我们就可以只需要看一边就能判断这个数是否为素数了,不需要再去看大的数目了,所以这时候循环结束条件的最大值就可以定为√n,直接省略掉了一半需要判断的数目,提高了效率

需要注意的是此处的判断条件从变成了<=,因为我们还需要判断平方根本身

通过上述方法,便可以轻松的判断一个数是否为素数啦

当然还有更进一步的优化

进一步优化:跳过偶数

除2外,素数均为奇数,所以因子就不会有偶数了,可跳过偶数除数。

public static boolean isPrime(int n) {
    if (n <= 1) return false;
    if (n == 2) return true;
    if (n % 2 == 0) return false;
    for (int i = 3; i <= Math.sqrt(n); i += 2) {//每次+2,跳过除数为偶数的判断
        if (n % i == 0) return false;
    }
    return true;
}
 

效果:循环次数再减半。

总结

  • 基础方法:简单但低效,适合教学理解。
  • 平方根优化:显著减少循环次数,适用于多数场景。
  • 跳过偶数:进一步提升效率,尤其适合大数判断。

到此这篇关于Java中判断一个数是否为素数(质数)的文章就介绍到这了,更多相关Java判断素数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java中的Integer的toBinaryString()方法实例

    java中的Integer的toBinaryString()方法实例

    这篇文章主要介绍了java中的Integer的toBinaryString()方法实例,有需要的朋友可以参考一下
    2013-12-12
  • Java集成swagger文档组件

    Java集成swagger文档组件

    这篇文章主要介绍了Java集成swagger文档组件,通过详细的图文介绍和代码分析展示,从头展开说明详细的过程,希望对你的开发有所帮助
    2021-06-06
  • Jackson序列化和反序列化忽略字段操作

    Jackson序列化和反序列化忽略字段操作

    这篇文章主要介绍了Jackson序列化和反序列化忽略字段操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Spring事务失效场景原理及解决方案

    Spring事务失效场景原理及解决方案

    这篇文章主要介绍了Spring事务失效场景原理及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • SpringBoot中使用监听器的方法详解

    SpringBoot中使用监听器的方法详解

    这篇文章主要为大家详细介绍了SpringBoot中使用监听器的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Java 异常详解

    Java 异常详解

    本文主要介绍了异常与错误的区别,异常的体现分类,异常的处理机制,如何自定义异常等,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • SpringBoot集成WebSocket实现前后端消息互传的方法

    SpringBoot集成WebSocket实现前后端消息互传的方法

    这篇文章主要介绍了SpringBoot集成WebSocket实现前后端消息互传的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Java版微信公众号支付开发全过程

    Java版微信公众号支付开发全过程

    这篇文章主要介绍了Java版微信公众号支付开发全过程,本文通过实例相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • SpringBoot详细分析自动装配原理并实现starter

    SpringBoot详细分析自动装配原理并实现starter

    相对于传统意义上的Spring项目,SpringBoot具有开箱即用,简化配置,内置Tomcat等等等等一系列的特点。在这些特点中,最重要的两条就是约定优于配置和自动装配
    2022-07-07
  • Java 添加数字签名到excel及检测,删除签名

    Java 添加数字签名到excel及检测,删除签名

    这篇文章主要介绍了Java 添加数字签名到excel及检测,删除签名的方法,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04

最新评论