图解Sieve of Eratosthenes(埃拉托斯特尼筛法)算法求解素数个数

1.素数的定义

  • 素数又称质数。
  • 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
  • 一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数)。

2.问题引入:如何在数据规模较大的情况下高效的求解?

在这里插入图片描述

在这里插入图片描述

3.朴素解法

// 找出小于n的所有素数的方法public static List<Integer> findPrimes(int n) {List<Integer> primes = new ArrayList<>();for (int num = 2; num < n; num++) {if (isPrime(num)) {primes.add(num);}}return primes;}// 判断一个数是否为素数的方法private static boolean isPrime(int num) {if (num <= 1) {return false;}//注意这里只需要遍li到根号num即可//for (int i = 2; i * i <= num; i++) {if (num % i == 0) {return false;}}return true;}

在这里插入图片描述

在数据规模较大的情况下,这种暴力解法效率低下,是不可取的。

4.Sieve of Eratosthenes(埃拉托斯特尼筛法)

The sieve of Eratosthenes is one of the most efficient ways to find all primes smaller than n when n is smaller than 10 million or so.
当n小于1000万左右时,埃拉托色尼筛法是寻找所有小于n的质数最有效的方法之一。

When the algorithm terminates, all the numbers in the list that are not marked are prime.

当算法结束时,列表中所有未标记的数字都是素数。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

时间复杂度:n*log(log(n))

代码实现:

Java:

// Java程序,使用埃拉托斯特尼筛法打印小于或等于n的所有素数class SieveOfEratosthenes {void sieveOfEratosthenes(int n){// 创建一个布尔数组 "prime[0..n]" 并将所有条目初始化为true。// 如果prime[i]最终为false,则i不是素数,否则为true。boolean prime[] = new boolean[n + 1];for (int i = 0; i <= n; i++)prime[i] = true;// 使用埃拉托斯特尼筛法for (int p = 2; p * p <= n; p++) {// 如果prime[p]仍然为true,则p是素数if (prime[p] == true) {// 更新所有p的倍数,这些倍数大于或等于p的平方,// 且小于等于n的数已经被标记过了for (int i = p * p; i <= n; i += p)prime[i] = false;}}// 打印所有素数for (int i = 2; i <= n; i++) {if (prime[i] == true)System.out.print(i + " ");}}// 主函数public static void main(String args[]){int n = 30;System.out.print("以下是小于或等于 " + n + " 的素数: ");SieveOfEratosthenes g = new SieveOfEratosthenes();g.sieveOfEratosthenes(n);}
}

C++:

// 使用埃拉托斯特尼筛法打印小于或等于n的所有素数的C++程序#include <bits/stdc++.h>
using namespace std;void SieveOfEratosthenes(int n)
{// 创建一个布尔数组 "prime[0..n]" 并将所有条目初始化为true。// 如果prime[i]最终为false,则i不是素数,否则为true。bool prime[n + 1];memset(prime, true, sizeof(prime));for (int p = 2; p * p <= n; p++) {// 如果prime[p]仍然为true,则p是素数if (prime[p] == true) {// 更新所有p的倍数,这些倍数大于或等于p的平方,// 且小于等于n的数已经被标记过了for (int i = p * p; i <= n; i += p)prime[i] = false;}}// 打印所有素数for (int p = 2; p <= n; p++)if (prime[p])cout << p << " ";
}// 主函数
int main()
{int n = 30;cout << "以下是小于或等于 " << n << " 的所有素数:" << endl;SieveOfEratosthenes(n);return 0;
}

Python:

# 使用埃拉托斯特尼筛法打印小于或等于n的所有素数的Python程序def SieveOfEratosthenes(n):# 创建一个布尔数组 "prime[0..n]" 并将所有元素初始化为True。# 如果prime[i]最终为False,则i不是素数,否则为True。prime = [True for i in range(n+1)]p = 2while (p * p <= n):# 如果prime[p]仍然为True,则p是素数if (prime[p] == True):# 更新所有p的倍数for i in range(p * p, n+1, p):prime[i] = Falsep += 1# 打印所有素数for p in range(2, n+1):if prime[p]:print(p)# 主函数
if __name__ == '__main__':n = 20print("以下是小于或等于 {} 的素数:".format(n))SieveOfEratosthenes(n)

为什么埃拉托斯特尼筛法只需要从每个素数的平方开始标记?

  • 因为小于 (p^2) 的数,如果它们是合数,已经被之前的素数标记过了。
  • 这样做可以确保每个合数只被标记一次,提高算法的效率。

示例:

  1. 初始化: 创建一个布尔数组 is_prime,长度为 n+1,其中 n 是我们要找出的最大素数的范围。数组中的每个元素都初始化为 True,表示该索引对应的数是素数。

    对于找出小于或等于 30 的所有素数,创建长度为 31 的数组。

    is_prime = [True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
    
  2. 筛选过程: 开始从第一个素数 2 开始筛选。

    • 素数 2 是第一个素数,我们从 (2^2 = 4) 开始,将所有大于等于 4 的偶数标记为 False,因为它们都可以被 2 整除。具体操作是将数组中索引为 4、6、8、10、12、… 的位置置为 False

      is_prime = [True, True, True, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False]
      
    • 接下来,选择下一个未被标记为 False 的数,即素数 3,因为小于 (3的平方) 的数,如果它们是合数,已经被之前的素数标记过了,所以直接从 (3^2 = 9) 开始,标记所有大于等于 9 的数中可以被 3 整除的数为 False

      is_prime = [True, True, True, True, False, True, False, True, False, False, False, True, False, True, False, False, False, True, False, True, False, False, False, True, False, False, False, True, False, True, False]
      
    • 继续这个过程,选择下一个未被标记为 False 的数,即素数 5,从 (5^2 = 25) 开始,标记所有大于等于 25 的数中可以被 5 整除的数为 False

      is_prime = [True, True, True, True, False, True, False, True, False, False, False, True, False, True, False, False, False, True, False, True, False, False, False, True, False, False, False, True, False, True, False]
      
  3. 提取素数: 最终,所有仍为 True 的索引位置(除了 0 和 1)表示素数。素数是 2、3、5、7、11、13、17、19、23、29。


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

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

相关文章

leetCode热题100——两数之和(python)

题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺…

Node.js 是一个开源的 跨平台的JavaScript运行环境

https://www.npmjs.com/ 中央仓库 Visual Studio Code - Code Editing. Redefined https://openjsf.org/ OpenJS 促进了关键 JavaScript 技术在全球范围内的广泛采用和持续发展。 Apache服务器 Nginx服务器 Tomcat服务器 Node.js服务器 Gunicorn服务器 uW…

低代码平台实践:打造高效动态表单解决方案的探索与思考

&#x1f525;需求背景 我司业务同事在抓取到候选人的简历之后&#xff0c;经常会出现&#xff0c;很多意向候选人简历信息不完整&#xff0c;一个个打电话确认的情况&#xff0c;严重影响了HR的工作效率&#xff0c;于是提出我们可以通过发送邮件、短信、H5链接的方式来提醒候…

.NET C# 操作Neo4j图数据库

.NET C# 操作Neo4j图数据库 目录 .NET C# 操作Neo4j图数据库环境Code 环境 VisualStudio2022 .NET 6 Neo4j.Driver 5.21 Code // 连接设置 var uri "bolt://localhost:7687"; var user "neo4j"; var password "password"; // 请替换为你的…

docker 配置与使用

目录 安装docker 作者遇到的问题1&#xff1a;安装docker 错误说明 解决方法&#xff1a; 作者遇到问题2&#xff1a;GPG密钥问题 问题说明 解决方法&#xff1a; 方法一&#xff1a;使用备用的GPG密钥服务器 方法二&#xff1a;使用国内镜像源 方法3&#xff1a;手动下…

使用lua开发apisix自定义插件并发布

接到老大需求&#xff1a;需要对cookie进行操作&#xff0c;遂查询apisix的自带插件&#xff0c;发现有&#xff0c;但不满足&#xff0c;于是自己开发了一个插件并部署&#xff0c;把开发部署流程写在这里打个日志怕以后忘掉。 一、需求 插件很简单&#xff0c;就是在reques…

什么是嵌入式,单片机又是什么,两者有什么关联又有什么区别?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;从科普的角度&#xff0c;…

HTTP 抓包工具——Fiddler项目实战

网络爬虫实质上是模拟浏览器向 Web 服务器发送请求。对于一些简单的网络请求&#xff0c;我们 可以通过查看 URL 地址来构造请求&#xff0c;但对于一些稍复杂的网络请求&#xff0c;仍然通过观察 URL 地 址将无法构造正确。因此我们需要对这些复杂的网络请求进行捕获分…

【总线】AXI4第二课时:深入AXI4总线的基础事务

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

数字化和信息化的区别是什么?

市面上有些企业专门区分出了数字化和信息化的区别&#xff0c;认为数字化基于信息化的基础之上。但也有一些专家认为两者不是独立或前后的概念&#xff0c;属于近似概念&#xff0c;它到底应当怎样被定义&#xff1f; 其实之前已经写过好几篇这个类型的文章了&#xff0c;但是总…

express+vue在线im实现【四】

往期内容 expressvue在线im实现【一】 expressvue在线im实现【二】 expressvue在线im实现【三】 本期示例 本期总结 支持了音频的录制和发送&#xff0c;如果觉得对你有用&#xff0c;还请点个免费的收藏与关注 下期安排 在线语音 具体实现 <template><kl-dial…

Retrofit类型安全的HTTP客户端库

简介 Retrofit是Square公司开发的一个类型安全的HTTP客户端库&#xff0c;用于Android和Java平台&#xff0c;它使得与Web服务的交互变得更加简单快捷。Retrofit将HTTP API转换成Java接口&#xff0c;让你可以用更简洁的代码形式调用RESTful API&#xff0c;Android网络编程重点…

Vue与SpringSecurity认证整合-06

Vue与SpringSecurity整合 我们要知道springsecurity是一个安全框架,我们在后端的时候没有接触前端,springsecurity引入依赖之后,启动项目会对我们进行拦截,让我们登录,然后我们制定了一个登录页面,也是后端的,我们可以指向我们的登录页面,但是与Vue整合之后,登录页面肯定是在Vu…

贾英才主任受聘担任“两个中心”专家委员会委员

近日&#xff0c;第二届海峡两岸中西医结合肾脏病学术大会授牌仪式在北京隆重举行。 这一盛会吸引了众多医学领域的专家学者&#xff0c;共同探讨中西医结合治疗肾脏病的最新进展和未来发展方向。 在此次大会上&#xff0c;崇文门中医医院的贾英才主任凭借其在肾脏病领域的卓…

【C语言 || 数据结构】二叉树

文章目录 前言 二叉树1.树1.1树的定义1.2 树的结构 2.特殊的树&#xff08;二叉树&#xff09;2.1 二叉树的概念2.2 特殊的二叉树2.3 二叉树的储存2.3.1 顺序储存二叉树2.3.2 链表储存二叉树 2.4 二叉树的遍历2.4.1 二叉树的中序遍历2.4.2 二叉树的前序遍历2.4.3 二叉树的后序遍…

【React】使用Token做路由权限控制

在components/AuthRoute/index.js中 import { getToken } from /utils import { Navigate } from react-router-domconst AuthRoute ({ children }) > {const isToken getToken()if (isToken) {return <>{children}</>} else {return <Navigate to"/…

服务器主机托管服务内容科普

在现代信息技术快速发展的背景下&#xff0c;服务器主机托管服务已成为众多企业、机构和个人不可或缺的一部分。本文将为您详细科普服务器主机托管服务的内容&#xff0c;帮助您更好地理解和选择适合自己的托管方案。 一、硬件与基础设施 服务器主机托管服务首先提供了硬件和网…

艾公益 艾多美(中国)有限公司向烟台市捐赠爱心物资

2024年6月18日&#xff0c;艾多美&#xff08;中国&#xff09;有限公司&#xff0c;在烟台市高新区举办了2项爱心捐赠仪式。 在本次爱心捐赠活动中&#xff0c;艾多美&#xff08;中国&#xff09;有限公司携手烟台市慈善总会向烟台市贫困女童捐赠助学金、爱心物资&#xff0c…

【字符串验证】验证码

【字符串验证】验证码 【参考代码】 #include <iostream> #include <cstring> using namespace std; int main(){ string a "AV8d";string b; cin >> b;for(int i0; i<a.length(); i){if(a[i]>A && a[i] < Z){a[i]32;}if…

算法008:四数之合

四数之和. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/4sum/description/ 在前面的两个题中&#xff0c;我们已经完成了两数之和和三数之和&#xff0c;到本题四…