Java求质数的几种常用算法分析

针对“Java求质数的几种常用算法分析”,我们可以从以下几个方面进行讲解:

算法分析

  • 方法1:暴力枚举
  • 方法2:素数筛法

方法1:暴力枚举

这种算法比较简单,直接从1到n枚举每一个数字,然后依次验证数字是否为质数。具体实现如下:

public static boolean isPrime(int n) {
    if (n <= 1) {
        return false;
    }
    for (int i = 2; i < n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

由于暴力枚举法需要从1到n枚举每一个数字,因此时间复杂度为O(N),效率较低。

方法2:素数筛法

相比于暴力枚举,素数筛法是一种更为高效的算法。基本思路是:首先初始化一个长度为n+1的布尔型数组,然后将数组中所有值赋为true,将0和1的位置赋为false,再从2开始遍历数组,将当前数字的倍数全部标记为false,直到遍历到n的位置为止,最后剩下的true即为质数。具体实现如下:

public static int[] sieve(int n) {
    boolean[] isPrime = new boolean[n + 1];
    Arrays.fill(isPrime, true);
    isPrime[0] = false;
    isPrime[1] = false;
    for (int i = 2; i <= Math.sqrt(n); i++) {
        if (isPrime[i]) {
            for (int j = i * i; j <= n; j += i) {
                isPrime[j] = false;
            }
        }
    }
    int[] primeNumbers = new int[n + 1];
    int count = 0;
    for (int i = 0; i <= n; i++) {
        if (isPrime[i]) {
            primeNumbers[count++] = i;
        }
    }
    return Arrays.copyOf(primeNumbers, count);
}

由于素数筛法只需要遍历一次数组,因此时间复杂度为O(N*log(log(N))),效率比暴力枚举法高得多。

案例示例

假设我们需要求出200以内的所有质数,我们可以使用上面的两种算法进行测试。具体代码如下:

暴力枚举法示例

public static void main(String[] args) {
    for (int i = 2; i <= 200; i++) {
        if (isPrime(i)) {
            System.out.print(i + " ");
        }
    }
}

输出结果:

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 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 

素数筛法示例

public static void main(String[] args) {
    int[] primeNumbers = sieve(200);
    for (int i = 0; i < primeNumbers.length; i++) {
        if (primeNumbers[i] == 0) {
            break;
        }
        System.out.print(primeNumbers[i] + " ");
    }
}

输出结果:

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 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 

从输出结果可以看出,两种算法均正确实现了求解200以内所有质数的功能。

结论

综上所述,在Java中求解质数的问题,暴力枚举法和素数筛法是比较常用的两种方法。其中暴力枚举法虽然简单易懂,但效率较低;而素数筛法则更为高效,但代码实现可能稍微有些复杂。需要根据具体实际需求场景选择合适的算法来解决问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java求质数的几种常用算法分析 - Python技术站

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

相关文章

  • js将键值对字符串转为json字符串的方法

    将键值对字符串转为JSON字符串的方法,可以使用JSON.parse()函数来实现。下面给出详细的攻略。 1. 确认键值对字符串的格式 在转换之前,需要确保键值对字符串的格式正确。格式应该是键值对之间使用逗号分隔,键与值之间使用冒号分隔,整个字符串包裹在一对花括号内。 例如,以下的字符串是合法的键值对字符串: {"name": &quot…

    Java 2023年5月26日
    00
  • 值得收藏的SpringBoot 实用的小技巧

    值得收藏的SpringBoot实用的小技巧 在SpringBoot的开发过程中,有一些实用的小技巧可以提高开发效率,降低代码量和阅读难度。下面列举了一些值得收藏的小技巧。 1. 使用lombok简化实体类的编写 在实体类中,我们通常需要定义常量、属性、getter/setter、toString等方法,这些方法都是重复的代码,使用lombok可以自动生成这些…

    Java 2023年5月15日
    00
  • JavaWeb框架MVC设计思想详解

    下面我将详细讲解“JavaWeb框架MVC设计思想详解”的完整攻略。 什么是MVC设计思想 MVC是Model View Controller的缩写,是一种设计模式。在MVC模式中,应用被分为三个核心部件:模型(Model)、视图(View)和控制器(Controller)。这三个部件各自有着自己清晰的职责: 模型(Model):负责数据的管理和存储,提供数…

    Java 2023年6月15日
    00
  • tomcat单机多实例的实现

    Tomcat单机多实例的实现是在一台物理服务器上配置多个Tomcat实例,每个实例可以有自己的配置文件、发布目录和端口号,以实现对 Web 应用的快速部署和管理。 下面是实现多实例的详细步骤: 1. 安装 Tomcat 首先需要安装Tomcat,可以到官网下载最新版本,并按照提示进行安装,安装过程很简单,不再赘述。 2. 创建实例目录 在 Tomcat 安装…

    Java 2023年6月2日
    00
  • 【SSM】一、了解Sping 框架

    〇、Maven 0.1 什么是Maven? Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build…

    Java 2023年4月25日
    00
  • 使用spring的restTemplate注意点

    使用Spring的RestTemplate是在Java中向REST API发送HTTP请求的一种常见方法。它提供了许多方便的方法来处理HTTP请求和响应。使用RestTemplate时需要注意以下几点。 注意点一:配置RestTemplate的HttpClient RestTemplate的默认实现使用HttpURLConnection作为底层客户端,然而在…

    Java 2023年6月3日
    00
  • 如何避免对象引用的循环依赖?

    如何避免对象引用的循环依赖 在面向对象编程中,一个对象可能同时引用了另一个对象,这种引用关系如果不注意可能会出现循环依赖问题,即两个或多个对象相互引用,彼此依赖,无法被垃圾回收机制回收,导致内存泄漏。此时就需要采取一些方式来避免对象引用的循环依赖。下面介绍两种常用的方式: 方法一:使用弱引用 弱引用是一种比较常见的避免循环依赖的方式,它可以让对象之间的相互引…

    Java 2023年5月11日
    00
  • 使用Java打印数字组成的魔方阵及字符组成的钻石图形

    下面我详细讲解一下“使用Java打印数字组成的魔方阵及字符组成的钻石图形”的完整攻略。 打印数字组成的魔方阵 思路 魔方阵是由 $n^2$ 个数字组成的方阵,其中每一行、每一列、每一条对角线上的数字之和都相等。我们可以使用以下的算法来生成 $n \times n$ 的魔方阵: 将数字 1 放在第一行的中间列。 依次将后续的数字放入前一个数字的右上角(如果已经…

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