java如何判断一个数是否是素数(质数)

判断一个数是否是素数是一个常见的算法问题,下面是用java编写的实现方法:

1.判断算法

判断一个数x是否为素数的方法是判断x是否能被2~sqrt(x)范围内的整数整除。如果有一个数能够整除x,那么x就不是素数,否则x就是素数。

示例代码:

public static boolean isPrime(int x) {
    if (x < 2) {  // 小于2的数都不是素数
        return false;
    }
    for (int i = 2; i <= Math.sqrt(x); i++) {
        if (x % i == 0) {   // 能够整除
            return false;
        }
    }
    return true;
}

2.测试算法

为了测试isPrime算法的正确性,我们可以编写一个程序,用于判断指定范围内的所有整数是否为素数,并输出结果。

示例代码:

public static void main(String[] args) {
    int n = 100;
    System.out.printf("2~%d的素数:\n", n);
    for (int i = 2; i <= n; i++) {
        if (isPrime(i)) {
            System.out.print(i + " ");
        }
    }
}

输出结果:

2~100的素数:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

上述程序会输出2~100的素数,结果与数学事实相符。因此可以证明isPrime算法的正确性。

3.优化算法

在调用isPrime算法时,我们只需要判断2~sqrt(x)范围内是否有数能够整除x,因此可以做个小优化:只需判断2和所有奇数是否能够整除x即可,因为偶数都能够被2整除。

修改isPrime算法:

public static boolean isPrime(int x) {
    if (x < 2) {  // 小于2的数都不是素数
        return false;
    }
    if (x == 2 || x == 3) {  // 2和3都是素数
        return true;
    }
    if (x % 2 == 0) {  // 偶数都不是素数
        return false;
    }
    for (int i = 3; i <= Math.sqrt(x); i += 2) {
        if (x % i == 0) {   // 能够整除
            return false;
        }
    }
    return true;
}

这个修改后的算法将只会判断2和所有奇数是否能够整除x,从而加快了算法的执行速度。

示例代码:

public static void main(String[] args) {
    int n = 100;
    System.out.printf("2~%d的素数:\n", n);
    for (int i = 2; i <= n; i++) {
        if (isPrime(i)) {
            System.out.print(i + " ");
        }
    }
}

输出结果:

2~100的素数:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

可以看到,输出结果与前面的测试结果相同,但是这个算法的执行速度要更快。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java如何判断一个数是否是素数(质数) - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java中TypeReference用法详情说明

    当我们需要在Java中将一个类型传递给另一个类或方法的时候,通常需要使用TypeReference。TypeReference是一个泛型类,它用于获取某个泛型类型的完整信息。 下面提供两个示例,以说明TypeReference的用法: 示例一:获取Map泛型类型的完整信息 假设我们有一个Map类型的变量,我们想要知道它的泛型类型是什么,该怎么办呢? Map&…

    Java 2023年5月26日
    00
  • Java多线程编程基石ThreadPoolExecutor示例详解

    Java多线程编程基石ThreadPoolExecutor示例详解 简介 Java的多线程编程需要使用线程池Thread Pool。线程池是一组线程集合,可以被执行多次,且必须共享一份线程队列和一个线程池。ThreadPoolExecutor是Java中一个高级线程池,提供了许多用于线程池管理的功能。本文将详细介绍ThreadPoolExecutor的相关内…

    Java 2023年5月19日
    00
  • 基于Spring整合mybatis的mapper生成过程

    下面是基于Spring整合MyBatis的Mapper生成过程的完整攻略。 1. 准备工作 在开始整合MyBatis和Spring之前,确保已经完成以下工作: 已经拥有一个Spring项目并且能够正常运行; 已经添加了MyBatis和MyBatis-Spring的依赖; 已经配置了MyBatis的数据源、事务管理和SqlSessionFactory等内容。 …

    Java 2023年5月20日
    00
  • Struts2相关的面试题整理分享

    下面是Struts2相关的面试题整理分享的完整攻略。 1. Struts2简介 Struts2是一个基于MVC设计模式的Web开发框架,它基于Java Servlet技术,可以帮助开发者更方便地创建Web应用程序。 1.1 MVC架构 MVC架构将应用程序分为3个主要部分: Model:应用程序数据及其处理 View:用户界面的展示 Controller:接…

    Java 2023年5月20日
    00
  • springboot创建多module项目的实例

    创建多module项目是一个常见的需求,它可以帮助我们更好地组织代码,提高代码的可维护性和可扩展性。在Spring Boot中,创建多module项目也非常容易,本文将详细讲解如何创建多module项目的实例。 创建多module项目的步骤 以下是创建多module项目的步骤: 创建一个空的Maven项目。 mvn archetype:generate -D…

    Java 2023年5月15日
    00
  • Java常用类String的面试题汇总(java面试题)

    下面是整理Java常用类String的面试题汇总的详细攻略。 1. String类的概述 String类是Java中常用的类之一,是由JDK提供的一个不可变的final类,用于存储字符串数据,可以进行字符串的操作和处理。 2. 常见的String类面试题 2.1 如何比较两个字符串是否相等? 首先要了解的是,Java中有两种比较方式,一种是基本类型的比较(=…

    Java 2023年5月20日
    00
  • 解析Java异常的栈轨迹及其相关方法

    当Java程序出现异常时,JVM会捕获异常并打印出异常信息,其中最重要的部分就是异常的栈轨迹,它可以告诉我们异常发生的具体位置以及异常发生的原因。解析Java异常的栈轨迹及其相关方法对于排查问题而言是非常有帮助的。 1. 异常栈轨迹是什么? 异常栈轨迹是指从异常抛出点到Java虚拟机栈顶的执行路线。每个栈帧表示了方法执行的状态,栈帧之间连接起来形成一条路线,…

    Java 2023年5月27日
    00
  • Java8中新判空方法之Optional类的使用详解

    Java8新判空方法之Optional类的使用详解 简介 在Java8中,我们可以使用Optional类来优雅地处理 null 值的情况。 Optional 是一个容器对象,可能包含可null 可非null 的值。使用 Optional类,我们可以减少代码中出现的nullPointerException异常,从而使代码更加优雅。 Optional类的使用方式…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部