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判断素数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot 3整合ShardingSphere-Jdbc分库分表实战

    Spring Boot 3整合ShardingSphere-Jdbc分库分表实战

    本文主要介绍了Spring Boot 3整合ShardingSphere-Jdbc分库分表实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-10-10
  • Java基础之代理原理与用法详解

    Java基础之代理原理与用法详解

    这篇文章主要介绍了Java基础之代理原理与用法,结合实例形式详细分析了java代理的概念、原理、用法及相关操作注意事项,需要的朋友可以参考下
    2020-02-02
  • Java CompletableFuture 多任务编排方法实践指南

    Java CompletableFuture 多任务编排方法实践指南

    本文详细介绍了CompletableFuture的核心方法,按功能分类整理,包括创建方法、完成处理方法、链式转换方法、组合方法、多Future聚合方法、状态检查方法,并结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2026-01-01
  • Java static关键字详细介绍与用法总结

    Java static关键字详细介绍与用法总结

    这篇文章主要介绍了Java中static关键字的作用和用法详细介绍,主要讲了静态方法、静态变量、静态类、static和final一块用等内容。需要的朋友可以参考下
    2017-04-04
  • mybatis查询SqlServer慢问题及解决

    mybatis查询SqlServer慢问题及解决

    这篇文章主要介绍了mybatis查询SqlServer慢问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Java 设计模式以虹猫蓝兔的故事讲解单例模式

    Java 设计模式以虹猫蓝兔的故事讲解单例模式

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
    2022-03-03
  • Mybatis中如何设置sqlSession自动提交

    Mybatis中如何设置sqlSession自动提交

    在MyBatis中,默认情况下,获取的SqlSession对象不会自动提交事务,这意味着在进行更新、删除或插入等操作后,需要显式调用commit方法来提交事务,但是,可以在获取SqlSession时通过将openSession方法的参数设置为true
    2024-09-09
  • 如何解决Gradle、Maven项目build后没有mybatis的mapper.xml文件的问题

    如何解决Gradle、Maven项目build后没有mybatis的mapper.xml文件的问题

    这篇文章主要介绍了如何解决Gradle、Maven项目build后没有mybatis的mapper.xml文件的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 详解java迭代器模式

    详解java迭代器模式

    这篇文章主要介绍了java迭代器模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • RabbitMQ在springboot中实现短信服务的异步通信方式

    RabbitMQ在springboot中实现短信服务的异步通信方式

    RabbitMQ是一个开源消息中间件,适用于异步通信、应用解耦、可靠消息传递、灵活路由、延迟消息处理和分布式系统调等场景,SpringBoot使用需要新建队列、交换机并配置绑定,文章通过短信验证码服务为例,演示了RabbitMQ在项目中的应用场景和配置方法
    2026-05-05

最新评论