【LeetCode】统计N以内的素数(质数)

题述

给定一个值n,统计2~n以内,素数的个数
说明:
素数,即质数。除0、1以外,只能被1和自身整除的自然数,即为素数。
例:
输入:100
输出:25

解决办法

方式一:(暴力解法)

思路

直接从2开始遍历,判断是否能被2到自身之间的数整除

代码示例

public class CountPrime {public static void main(String[] args) {System.out.println(countPrime(100));}private static int countPrime(int n) {int count = 0;for (int i = 2; i < n; i++) {if (isPrime(i)) {count++;}}return count;}/*** 判断输入的数是否为质数** @param x 输入的数* @return true:是;false:否*/private static boolean isPrime(int x) {for (int i = 2; i < x; i++) {if (x % i == 0) {return false;}}return true;}
}

改进思路

上面的暴力解法虽然可以用,但其实还是存在可以优化的地方的。为啥,因为【乘法结合律】的存在。

2 * 50=100; 50 * 2 = 100;
4 * 25=100; 25 * 4 = 100;
以此类推。 如果 a能被x整除得到b,那么b也能被x整除得到a

所以,可以这么说,因为【乘法结合律】,所以我们在计算数能否被某个数整除的时候,可以不用完全遍历,只需要遍历到根号x就可以,如下图所示:(但是根号x不容易表示,所以换一个方式,i * i <= x)

    private static boolean isPrime(int x) {for (int i = 2; i * i <= x; i++) {if (x % i == 0) {return false;}}return true;}

方式二:(埃氏筛选法)

思路

利用合数的概念(非素数),素数*m必然是合数,因此可以从2开始遍历,将所有的合数做上标记,用空间换时间。什么意思呢?
比如,3是素数,那么肯定有如下规律:

3 * 2 = 6; 合数
3 * 3 = 9; 合数
3 * 4 = 12; 合数
3 * 5 = 15; 合数
以此类推,3 * m必然是合数,一直到 3 * m < n 。将这些提前给标记上

代码示例

public class CountPrime {public static void main(String[] args) {System.out.println(eratosthenes(100));}/*** 判断输入的数是否为质数** @param x 输入的数* @return true:是;false:否*/private static int eratosthenes(int x) {boolean[] isPrime = new boolean[x];int count = 0;for (int i = 2; i < x; i++) {if (!isPrime[i]) {count++;// 标记合数for (int j = 2 * i; j < x; j += i) {isPrime[j] = true;}}}return count;}
}

上面的标记合数循环,大家可能一时间反应不过来。j+=i的原理是【加法分配律】。3 * i = (2 + 1) * i = 2 * i + 1 * i。所以,为了累加i的系数m,每次+i就可以了。

改进思路

上面的算法还可以继续改进,跟方式一的改进思路差不多。在内部循环标记合数的时候,存在重复标记情况。比如:(假定输入的n=100)

  1. i=2时,会标记2 * k (k>=2, 2 * k < x) ,即 2 * 2,2 * 3,2 * 4,··· 2 * 50,起码已经标记了50 - 2 + 1个元素了;
  2. i=3时,会标记3 * k (k>=2, 3 * k < x) ,即 3 * 2,3 * 3,3 * 4,··· 3 * 33,起码已经标记了33 - 2 + 1个元素了;
  3. i=4时,会标记4 * k (k>=2, 4 * k < x) ,即 4 * 2,4 * 3,4 * 4,··· 4 * 25,起码已经标记了25 - 2 + 1个元素了。
  4. i=5时,会标记5 * k (k>=2, 5 * k < x),事实上,5 * 3早在前面就被标记过了;5 * 4 = 20,则早在i =2时标记过了

显然,如果我们按部就班的标记,肯定会存在交叉、冗余标记。
从上面的描述我们可以总结出一个规律,当i > 2 (2 * i) ~ (i-1) * i的部分肯定已经被标记过了。所以,修改内部循环算法如下:

        private static int eratosthenes(int x) {long start = System.currentTimeMillis();// 默认全部标记为素数boolean[] isNotPrime = new boolean[x];int count = 0;outer:for (int i = 2; i < x; i++) {if (!isNotPrime[i]) {count++;// 标记合数for (int j = i * i; j > 0 && j < x; j += i) {isNotPrime[j] = true;}}}System.out.println("耗时:" + (System.currentTimeMillis()-start));return count;}

注意:当i比较大的时候,可能会出现i * i > Integer.MAX_VALUE的情况,所以需要判断j > 0才能继续操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/20612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

删除注释(力扣)

删除注释 题目 给一个 C 程序&#xff0c;删除程序中的注释。这个程序source是一个数组&#xff0c;其中source[i]表示第 i 行源码。 这表示每行源码由 ‘\n’ 分隔。 在 C 中有两种注释风格&#xff0c;行内注释和块注释。 字符串// 表示行注释&#xff0c;表示//和其右侧…

冒泡排序【Java算法】

文章目录 1. 概念2. 思路3. 代码实现 1. 概念 比较前后相邻的两个数据&#xff0c;如果前面数据大于后面的数据&#xff0c;就将这两个数据互换。这样对数组的第0个数据到第 N - 1 个数据进行一次遍历后&#xff0c;最大的一个数据就 “沉” 到数组的第 N - 1 个位置。 N N - …

知识区博主转型——兼做知识区和改造区博主!!!!!

想脱单的进来&#xff0c;一起交流如何能脱单&#xff01;&#xff01;&#xff01; 为什么——我太羡慕有对象的人了哭死&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 你是不是很羡慕别人怎么都有女朋友 别人家的女朋友怎么都那么好&#xff…

FPGA学习—通过数码管实现电子秒表模拟

文章目录 一、数码管简介二、项目分析三、项目源码及分析四、实现效果五、总结 一、数码管简介 请参阅博主以前写过的一篇电子时钟模拟&#xff0c;在此不再赘述。 https://blog.csdn.net/qq_54347584/article/details/130402287 二、项目分析 项目说明&#xff1a;本次项目…

RISCV 5 RISC-V调用规则

RISCV 5 RISC-V调用规则 1 Register Convention1.1 Integer Register Convention1.2 Floating-point Register Convention 2. Procedure Calling Convention2.1 Integer Calling Convention2.2 Hardware Floating-point Calling Convention2.3 ILP32E Calling Convention2.4 Na…

大数据课程F4——HIve的其他操作

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 掌握HIve的join&#xff1b; ⚪ 掌握HIve的查询和排序 ⚪ 掌握HIve的beeline ⚪ 掌握HIve的文件格式 ⚪ 掌握HIve的基本架构 ⚪ 掌握HIve的优化&#xff1b; 一、jo…

想了解好用的翻译pdf的软件吗?

在全球化的时代背景下&#xff0c;跨国贸易越来越普遍&#xff0c;跨语言沟通也越来越频繁。小黄是一家跨国公司的员工&#xff0c;他梦想能在全球各地拓展自己的业务&#xff0c;奈何遇到了一个巨大的挑战&#xff1a;跨语言沟通。在这其中&#xff0c;pdf文件是他经常接收到的…

java基础总结

1.java静态变量&#xff0c;代码块&#xff0c;和静态方法执行顺序是什么 代码块分三种&#xff1a;static静态代码块&#xff0c;构造代码块&#xff0c;普通代码块 代码块执行顺序&#xff1a;静态代码块 -> 构造代码块 -> 构造函数 -> 普通代码块 继承中代码块执…

linux基本功系列之cd命令实战

文章目录 前言一. cd命令的介绍二. 语法格式及常用选项三. 参考案例总结 前言 居然发现了落下了CD命令&#xff0c;也不算落下把&#xff0c;主要是cd命令内容太少&#xff0c;撑不起一篇文章&#xff0c;今天也写一写&#xff0c;就当记个笔记吧 &#x1f3e0;个人主页&#…

阿里云国际站香港地域服务器访问延迟丢包的原因及解决方法

阿里云百科有2台香港地域的轻量应用服务器&#xff0c;国内使用发现Ping值延迟丢包严重&#xff0c;从大陆到香港访问是经过国际链路和运营商国际路由节点&#xff0c;会受到到国际链路拥塞&#xff0c;以及运营商出境路由限制&#xff0c;导致无法正常连接或访问某些网站&…

ubuntu下,在vscode中使用platformio出现 Can not find working Python 3.6+ Interpreter的问题

有一段时间没有使用platformio了&#xff0c;今天突然使用的时候&#xff0c;发现用不了&#xff0c;报错&#xff1a; Ubuntu PlatformIO: Can not find working Python 3.6 Interpreter. Please install the latest Python 3 and restart VSCode。 上网一查&#xff0c;发现…

新人入职培训感悟

【新世界扬帆】校招新人训练营学习总结_刘珍珍 问题&#xff1a;帮我写一段关于新人入职培训后的感悟&#xff0c;内容需要包括回顾本次新人培训&#xff0c;我参与了哪些课程和活动的学习&#xff1f;在这些内容中&#xff0c;我觉得对我最有帮助的是哪些&#xff1f;这些内容…

使用docker部署node和react应用

使用docker部署node和react应用 Docker 使开发人员能够将所有应用程序打包到容器中。这些容器可以在任何安装了 Docker 的机器上运行&#xff0c;并且应用程序将是相同的。这是在多个系统上运行代码库克隆的好方法&#xff0c;并且我们可以确保它们都是相同的。 在本文中&…

设计模式八:桥接模式(Bridge Pattern)

桥接模式是一种结构型设计模式&#xff0c;用于将抽象与实现分离&#xff0c;使它们可以独立地变化。桥接模式的核心思想是将一个大类或多个紧密相关的类分为两个独立的层次结构&#xff0c;从而实现解耦。 在桥接模式中&#xff0c;存在两个维度的类/对象结构&#xff1a;抽象…

【Liux下6818开发板(ARM)】触摸屏

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

Mac Navicat 16试用脚本

一、无限试用脚本如下 #!/bin/bash #/usr/libexec/PlistBuddy -c "print" ~/Library/Preferences/com.navicat.NavicatPremium.plist /usr/libexec/PlistBuddy -c "Delete :91F6C435D172C8163E0689D3DAD3F3E9" ~/Library/Preferences/com.navicat.Navica…

MacOS上用docker运行mongo及mongo-express

MongoDB简介 MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。 前提 要求…

高校陆续拥抱chatgpt,人工智能会给学术带来什么变化会有什么影响

在当今信息爆炸的时代&#xff0c;人工智能在各行各业都发挥着越来越重要的作用&#xff0c;高校教育领域也不例外。最近&#xff0c;越来越多的高校开始陆续拥抱chatgpt&#xff08;Chatbot GPT&#xff09;这一人工智能技术&#xff0c;在学术领域会带来了怎样的变化与影响&a…

【RabbitMQ(day3)】扇形交换机和主题交换机的应用

文章目录 第三种模型&#xff08;Publish/Subscribe 发布/订阅&#xff09;扇型&#xff08;funout&#xff09;交换机Public/Subscribe 模型绑定 第四、第五种模型&#xff08;Routing、Topics&#xff09;第四种模型&#xff08;Routing&#xff09;主题交换机&#xff08;To…

在线五子棋对战

目录 数据管理模块&#xff08;数据库设计&#xff09; 前端界面模块 业务处理模块 会话管理模块网络通信模块(session,cookie) 在线管理模块 房间管理模块 用户匹配模块 项目扩展 数据管理模块&#xff08;数据库设计&#xff09; 数据库中有可能存在很多张表&#xf…