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日

相关文章

  • 什么是字节码?

    以下是关于字节码的完整使用攻略: 什么是字节码? 字节码是Java程序编译后的中间代码,它是一种与平台无关的二进制格式。字节码可以在Java虚拟(JVM)上运行,VM将字节码解释成机器码并执行。 字节码的优点 字节码具有以下优点: 跨平台性由于字节码是与平台关的,因此程序可以在不同的操作系统上运行,而不需要修改代码。 安全性由于字节码是中代码,因此它可以被反…

    Java 2023年5月12日
    00
  • Mybatis源码分析之插件模块

    “Mybatis源码分析之插件模块”是一篇深入剖析Mybatis插件模块的文章。总的来说,Mybatis插件模块的实现流程可以概括为下面四个核心类别:Interceptor、InterceptorChain、Plugin和Invocation。 Interceptor接口:插件必须实现的接口,提供了intercept()方法以便拦截Mybatis的方法调用。…

    Java 2023年6月1日
    00
  • java实现简单的图书借阅系统

    Java实现简单的图书借阅系统 一、需求分析 在设计图书借阅系统之前,我们需要进行需求分析,了解系统需要实现哪些功能。 管理员功能 添加图书:管理员可以添加图书到系统中,包括图书名称、作者、出版社、ISBN码等信息。 删除图书:管理员可以删除系统中的图书。 修改图书信息:管理员可以修改系统中的图书信息。 查询图书:管理员可以查询系统中的图书列表,包括已借出和…

    Java 2023年5月19日
    00
  • centos7安装mysql并jdbc测试教程

    下面我就为您讲解“CentOS 7安装MySQL并JDBC测试教程”的完整攻略。 安装MySQL 首先,在CentOS 7上安装MySQL需要使用yum包管理器。 步骤1:添加MySQL Yum Repository MySQL官方提供了MySQL Yum Repository来帮助我们更简便地安装MySQL。 使用下面的命令添加官方仓库: sudo rpm…

    Java 2023年6月16日
    00
  • java实现简单学生成绩管理系统

    下面是“Java实现简单学生成绩管理系统”的完整攻略: 1. 系统简介 本学生成绩管理系统是用Java语言编写的一个简单的命令行应用程序,用于管理学生的考试成绩。系统可以实现以下功能: 添加学生信息 添加学生成绩 查询学生成绩 修改学生成绩 删除学生成绩 统计学生成绩 2. 思路分析 在实现该系统之前,需要对系统的流程进行分析和设计。系统主要分为两类数据,学…

    Java 2023年5月19日
    00
  • SpringMVC 接收前端传递的参数四种方式小结

    下面我将为你详细讲解“SpringMVC 接收前端传递的参数四种方式小结”的攻略。 一、前言 在 SpringMVC 框架中,接收前端传递的参数是非常常见的操作,而我们可以通过以下四种方式来实现参数接收: URL传参 表单提交 请求参数自动封装 RESTful接口传参 下面我们将分别对这四种方式进行详细讲解。 二、URL传参 在 SpringMVC 框架中,…

    Java 2023年6月15日
    00
  • Java案例使用集合方法实现统计任意字符串中字符出现的次数

    Java案例使用集合方法实现统计任意字符串中字符出现的次数 需求分析 我们需要编写一个Java程序,统计任意一个字符串中每个字符出现的次数。输入任意一个字符串,程序返回一个Map,其中键为字符,值为该字符在字符串中出现的次数。 设计思路 本问题我们将使用 Java 语言中的 Map 与字符数组( char[] )来实现。 遍历输入的字符串,将字符串中出现的字…

    Java 2023年5月27日
    00
  • struts2 action跳转调用另一个程序

    下面是详细讲解“struts2 action跳转调用另一个程序”的完整攻略。 1. 背景 在实际应用中,我们经常需要在一个操作完成后,跳转到另一个程序执行相应的操作。这时候,就需要在struts2 action中进行页面跳转,并调用另一个程序。下面我们来讲解具体的实现步骤。 2. 实现步骤 2.1 页面跳转 首先,在struts2 action中进行页面跳转…

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