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

下面是关于“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日

相关文章

  • SpringBoot整合Shiro实现权限控制的代码实现

    下面我将为您详细讲解“SpringBoot整合Shiro实现权限控制的代码实现”的完整攻略,主要分为以下几个步骤: 1. 引入相关依赖 在 pom.xml 中添加以下依赖: <dependencies> <!– SpringBoot相关依赖 –> <dependency> <groupId>org.spri…

    Java 2023年5月20日
    00
  • 二、设置开发、运行环境

    关于“二、设置开发、运行环境”的完整攻略,我需要进行一些详细的讲解。具体如下: 1. 确定开发环境 首先,我们需要确定我们要使用哪一种语言和开发环境来进行网站开发。通常用于web开发的主流语言有PHP、Python、Ruby等,而开发环境则包括了各种编辑器、库、框架等工具。 例如,如果我们选择使用PHP来进行开发,那么我们可以选择使用著名的开发环境XAMPP…

    Java 2023年6月15日
    00
  • 浅谈springboot自动装配原理

    浅谈Spring Boot自动装配原理 Spring Boot是一个基于Spring框架的快速开发框架,它可以帮助我们快速构建Web应用程序。Spring Boot提供了许多自动配置类,可以帮助我们自动配置应用程序。本文将深入探讨Spring Boot自动装配的原理。 自动装配原理 Spring Boot的自动装配原理是基于Spring框架的自动装配原理。S…

    Java 2023年5月14日
    00
  • java中Struts2 的文件上传和下载示例

    Java中Struts2提供了方便的文件上传和下载的功能。下面将详细讲解文件上传和下载的示例。 文件上传示例 文件上传需要使用Struts2中的文件上传拦截器。详细步骤如下: 第一步:引入依赖 在项目的pom.xml文件中添加以下依赖: <dependency> <groupId>commons-fileupload</grou…

    Java 2023年5月20日
    00
  • Java实现简易图书借阅系统

    Java实现简易图书借阅系统攻略 系统需求 实现图书借阅功能 管理图书信息 管理用户信息 支持多个用户同时借阅不同的图书,且不会冲突 有管理员功能,可以添加、删除、修改图书信息和用户信息,可以查询某个用户的借阅情况 系统设计 数据设计 图书信息 书名 作者 出版社 出版日期 ISBN号 数量 借出数量 用户信息 姓名 学号/工号 密码 借出图书 借阅信息 借…

    Java 2023年5月19日
    00
  • Django使用paginator插件实现翻页功能的实例

    让我们来详细讲解如何使用Django的Paginator插件实现翻页功能的实例。 什么是Paginator插件 Paginator插件是Django自带的一个分页插件,可以方便地实现在查询数据时将结果按照指定条数进行分页显示,并提供了一个简单的分页导航栏,让用户方便快捷地在不同页面间进行切换。 Paginator插件的使用步骤 下面我们来一步一步地讲解如何使…

    Java 2023年6月16日
    00
  • 什么是内存溢出?

    以下是关于内存溢出的完整使用攻略: 什么是内存溢出? 内存溢出是指程序在申请内存时,没有足够的内存空间可供使用,导致程序无法正常运行。内存溢出是一种常见的程序错误,如果不及时处理,会导致程序崩溃或者系统崩溃。 以下是一个 C++ 中内存溢出的示例: void func() { *p = new int[1000000000000]; do something…

    Java 2023年5月12日
    00
  • JavaScript面向对象三个基本特征实例详解【封装、继承与多态】

    JavaScript面向对象三个基本特征实例详解 在JavaScript中,面向对象编程是一种常用的编程方式,它主要依靠三个基本特征:封装、继承和多态。下面将分别对它们进行详细的说明。 封装 封装是指将数据和行为封装在一个对象中,并对外部提供公共方法进行访问。 下面是一个使用封装的示例: class Person { constructor(name, ag…

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