java输出1~100之间的全部素数的5种方式总结

yizhihongxing

下面是关于“java输出1~100之间的全部素数的5种方式总结”的完整攻略:

问题描述

给定一个数字n,请输出1~n之间的全部素数。其中,素数指的是只能被1和自身整除的正整数,比如2、3、5、7等。

方案总结

方式一:暴力法

暴力法是最简单、也是最容易想到的解决方案。它的思路是通过循环从2到n-1,逐个判断每个数字是否为素数。这种方法的缺点是时间复杂度较高。

public static void primeNumbers(int n) {
    boolean isPrime;
    for (int i = 2; i <= n; i++) {
        isPrime = true;
        for (int j = 2; j < i; j++) {
            if (i % j == 0) {
                isPrime = false;
                break;
            }
        }
        if (isPrime) {
            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

方式二:优化暴力法

暴力法可以通过进行优化来提高效率。我们可以只判断2到i/2之间的数字是否为i的因子。以及,若i不能被2整除,则i也不可能被大于i/2的数字整除。因此我们可以在j循环中将范围缩小到2~i/2。

public static void primeNumbers2(int n) {
    boolean isPrime;
    for (int i = 2; i <= n; i++) {
        isPrime = true;
        for (int j = 2; j <= i/2; j++) {
            if (i % j == 0) {
                isPrime = false;
                break;
            }
        }
        if (isPrime) {
            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

方式三:优化暴力法(2)

在方式二的基础上,我们还可以进一步进行优化。对于每个待判断数字i,我们只需要判断它是否有小于等于根号i的因子。因此可以将j循环缩小到2~根号i。

public static void primeNumbers3(int n) {
    boolean isPrime;
    for (int i = 2; i <= n; i++) {
        isPrime = true;
        for (int j = 2; j <= Math.sqrt(i); j++) {
            if (i % j == 0) {
                isPrime = false;
                break;
            }
        }
        if (isPrime) {
            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

方式四:埃氏筛法

埃氏筛法是一种较为高效的求解素数的方法。它的原理是从2开始,将每个素数的倍数都标记为非素数(即false)。一个数如果没有被任何一个比它小的素数整除,那么它本身就是素数。埃氏筛法的时间复杂度约为O(nloglogn)。

public static void primeNumbers4(int n) {
    boolean[] isPrime = new boolean[n+1];
    Arrays.fill(isPrime, true);
    for (int i = 2; i <= Math.sqrt(n); i++) {
        if (isPrime[i]) {
            for (int j = i*i; j <= n; j+=i) {
                isPrime[j] = false;
            }
        }
    }
    for (int i = 2; i <= n; 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

方式五:线性筛法

线性筛法是在埃氏筛法的基础之上,进行了一定优化的算法。它使用一个表记录出所有的质数。其原理是保证每一个数只会被最小的质因子筛去,从而保证每个合数只会被筛一次,时间复杂度为O(n)。

public static void primeNumbers5(int n) {
    int[] primes = new int[n+1];
    boolean[] isPrime = new boolean[n+1];
    int count = 0;
    Arrays.fill(isPrime, true);
    for (int i = 2; i <= n; i++) {
        if (isPrime[i]) {
            primes[count++] = i;
        }
        for (int j = 0; j < count && i*primes[j] <= n; j++) {
            isPrime[i*primes[j]] = false;
            if (i % primes[j] == 0) {
                break;
            }
        }
    }
    for (int i = 2; i <= n; 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

总结

以上就是Java输出1~100之间的全部素数的5种方式总结。通过对不同方法的比较,可以看出优化算法和筛法的效率更高,而线性筛法更为快速和高效。我们可以根据具体情况选择不同的算法,以提高程序的运行效率和效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java输出1~100之间的全部素数的5种方式总结 - Python技术站

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

相关文章

  • IDEA + Maven环境下的SSM框架整合及搭建过程

    以下是“IDEA + Maven环境下的SSM框架整合及搭建过程”的完整攻略: 一、环境准备 首先确认开发环境已经具备以下工具和组件: JDK Tomcat MySQL Maven IDEA 二、创建Maven项目 在IDEA中创建Maven项目,选择Spring Initializr模板,在GroupId中输入自定义的项目组织名称(如com.example…

    Java 2023年5月20日
    00
  • 分布式医疗挂号系统SpringCache与Redis为数据字典添加缓存

    接下来我将为您详细讲解“分布式医疗挂号系统SpringCache与Redis为数据字典添加缓存”的完整攻略。 简介 分布式医疗挂号系统是一种可以为病人提供在线挂号、医生排队、诊断和用药等创新医疗系统。在此系统中,我们照常将业务逻辑和数据库中已缓存的数据保留存储,以便我们能够快速存取数据并提高网站的访问速度。这就需要我们利用缓存技术为数据字典添加缓存。这里将演…

    Java 2023年5月19日
    00
  • 每日几道java新手入门面试题,通往自由的道路

    完整攻略 理解面试题的重要性 在准备面试题之前,你需要理解面试题的重要性。它不仅可以帮助你提高自己的知识水平,还可以更好地准备面试,提高面试的通过率。同时,每道面试题都可以涉及到各种Java基础知识点的理解和运用,对于初学者而言这是非常有帮助的。 搜索并选择题目 在过去的每日几道Java新手入门面试题中,你需要选择那些与你的Java基础知识匹配的面试题,因为…

    Java 2023年5月19日
    00
  • SpringMVC使用RESTful接口案例

    下面是关于“SpringMVC使用RESTful接口案例”的完整攻略,包含两个示例说明。 SpringMVC使用RESTful接口案例 RESTful接口是一种基于HTTP协议的API设计风格,它使用HTTP方法(GET、POST、PUT、DELETE等)来实现对资源的操作。本文将介绍如何在SpringMVC中使用RESTful接口,并提供两个示例说明。 步…

    Java 2023年5月17日
    00
  • Spring Cloud Feign内部实现代码细节

    Spring Cloud Feign 是一种基于 Spring Cloud 的服务调用组件,它让服务调用过程更加简单、方便,同时也提供了丰富的扩展接口。在使用 Feign 的过程中,我们最多能够看到或者了解到的大概是 Feign 中的一些 API 和简单的使用方式。但是如果我们能够深入 Feign 内部实现的源代码,我们就能够得到更深入的理解和更加丰富的使用…

    Java 2023年5月19日
    00
  • JAVA读取文件夹大小的几种方法实例

    下面是针对“JAVA读取文件夹大小的几种方法实例”的完整攻略。 一、问题概述 在开发Java应用程序中,我们难免会遇到计算文件夹大小的需求。那么,在Java中,我们有哪些方法来获取文件夹的大小呢?本文将为大家详细介绍Java中获取文件夹大小的几种方法。 二、方法一:使用File类 我们可以使用Java自带的File类获取文件夹的大小,具体步骤如下: 创建一个…

    Java 2023年5月20日
    00
  • maven如何使用slf4j输出日志到文件

    使用 Maven 来构建项目时,常常需要对项目的运行状态进行日志记录,方便项目的调试和交付。SLF4J 是一个 Java 日志框架,具有轻量级、可扩展的特点,同时提供了多种日志实现的接口,便于灵活选择。本文将介绍如何使用 SLF4J 日志框架,在项目中输出日志到文件。 1. 引入依赖 首先,需要在项目中引入 SLF4J 的依赖。在工程的 pom.xml 文件…

    Java 2023年5月19日
    00
  • Java获取此次请求URL以及服务器根路径的方法

    获取此次请求URL和服务器根路径是Web开发中常用的操作,Java也提供了相应的方法来实现这个功能。下面是详细的攻略: 获取此次请求URL 方式一:使用HttpServletRequest对象 在Java Servlet中,通过HttpServletRequest对象可以获取此次请求的相关信息。其中,getRequestURL()方法可以获取请求的URL,如…

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