NOI大纲——普及组——素数筛法

素数筛的进化史

1.最为基础的筛法——试除法

时间复杂度 O ( n 2 ) O(n^2) O(n2)

int a[10000],tot=0,n;
for (int i=2;i<=n;i++){bool flag=false;for (int j=2;j<i;j++){if (i%j==0)flag=true;}if (flag==false){a[tot]=i;tot++;}
}
for (int i=0;i<tot;i++){cout<<a[i]<<" ";
}
//筛1到n的质数

2.试除法的优化

时间复杂度 O ( n × n ) O(n\times \sqrt{n}) O(n×n )

int a[10000],tot=0,n;
for (int i=2;i<=n;i++){bool flag=false;for (int j=2;j<=sqrt(i);j++){if (i%j==0)flag=true;}if (flag==false){a[tot]=i;tot++;}
}
for (int i=0;i<tot;i++){cout<<a[i]<<" ";
}
//筛1到n的质数

埃拉托色尼筛法(Eratosthenes Sieve)

埃拉托色尼筛法是一种古老且高效的算法,用于找出某个范围内所有的素数。它的工作原理基于反复标记出合数(即非素数)。其核心思想如下:

  1. 设定一个范围,例如从2到某个整数n。
  2. 从最小的素数2开始,标记2的所有倍数为合数(非素数)。
  3. 找到下一个未被标记的数,它是下一个素数,然后标记这个素数的所有倍数。
  4. 重复步骤3,直到到达范围的尽头。

下面是埃拉托色尼筛法的详细步骤及代码实现:

步骤详解

  1. 初始化数组:创建一个布尔数组isPrime,其大小为n+1,所有元素初始化为true。这个数组用于标记是否为素数。
  2. 标记合数:从2开始,对于每一个isPrime为true的数i,标记i的所有倍数为false。
  3. 终止条件:i的值不超过 n \sqrt{n} n 。因为如果i的值超过 n \sqrt{n} n ,i的倍数中最小的一个已经大于n,因此没有必要继续标记。

代码实现

int a[100000], tot = 0; // 存储素数的数组和计数器
bool ais[100000]; // 标记数组for (int i = 2; i <= n; i++) { // 从2开始遍历到nif (ais[i] == 0) { // 如果i没有被标记为合数a[tot++] = i; // 将i存入素数数组for (int j = 2; j < n && j * i <= n; j++) { // 从2开始标记i的倍数ais[i * j] = 1; // 标记i的倍数为合数}}
}for (int i = 0; i < tot; i++) { // 输出所有素数cout << a[i] << " ";
}

示例

假设我们要找出30以内的所有素数:

  1. 初始化:isPrime数组为[true, true, true, …, true],长度为31。
  2. 从2开始,标记2的倍数:4, 6, 8, 10, …, 30都标记为false。
  3. 下一个未标记的数是3,标记3的倍数:6, 9, 12, 15, …, 30都标记为false。
  4. 下一个未标记的数是5,标记5的倍数:10, 15, 20, 25, 30都标记为false。
  5. 继续下去,直到√30≈5.48。

结果:2, 3, 5, 7, 11, 13, 17, 19, 23, 29为素数。

欧拉筛(Euler’s Sieve)

欧拉筛法是埃拉托色尼筛法的一种改进版本,它在标记合数时避免了重复工作,因此效率更高。欧拉筛法利用了以下性质:

  1. 每个合数都可以表示为若干素数的乘积。
  2. 对于每个素数p,标记其倍数时,只需从它开始标记,不需要重复标记已经被其他素数标记过的数。

步骤详解

  1. 初始化数组:与埃拉托色尼筛法类似,初始化一个布尔数组isPrime和一个存储素数的数组a。
  2. 标记合数:对于每一个数i,如果它是素数,将其存入数组a,然后标记其所有的合数。
  3. 终止条件:当i的值达到n时停止。

代码实现

const int MAXN = 100000; // 定义常量,最大范围
int a[MAXN], tot = 0; // 存储素数的数组和计数器
bool isPrime[MAXN]; // 标记数组void eulerSieve(int n) {fill(isPrime, isPrime + n + 1, true); // 初始化标记数组,所有元素设为trueisPrime[0] = isPrime[1] = false; // 0和1不是素数for (int i = 2; i <= n; i++) { // 从2开始遍历到nif (isPrime[i]) { // 如果i是素数a[tot++] = i; // 将i存入素数数组}for (int j = 0; j < tot && a[j] * i <= n; j++) { // 遍历所有已存入的素数isPrime[a[j] * i] = false; // 标记a[j]和i的乘积为合数if (i % a[j] == 0) break; // 如果i是a[j]的倍数,停止标记}}// 输出所有素数for (int i = 0; i < tot; i++) {cout << a[i] << " ";}cout << endl;
}

示例

假设我们要找出30以内的所有素数:

  1. 初始化:isPrime数组为[true, true, true, …, true],长度为31。
  2. 从2开始,2是素数,存入数组a,标记2的倍数:4, 6, 8, 10, …, 30都标记为false。
  3. 下一个未标记的数是3,3是素数,存入数组a,标记3的倍数:6, 9, 12, 15, …, 30都标记为false。
  4. 继续下去,直到i达到30。

结果:2, 3, 5, 7, 11, 13, 17, 19, 23, 29为素数。

两种算法的比较

  • 效率:欧拉筛法避免了重复标记合数,因此在实际应用中效率比埃拉托色尼筛法更高。
  • 复杂度:两种算法的时间复杂度都是O(n log log n),但欧拉筛法的常数项更小。
  • 空间使用:两种算法都需要一个大小为n+1的布尔数组,因此在空间使用上没有显著差别。

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

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

相关文章

利用换元法计算积分的常见题型(考研高数复习)

考研中常见的几种换元法积分计算题 (1)被积式仅包含一个根式&#xff1a;根号下为有 a a a 和 x x x 的平方和/平方差 此种类型的积分题型&#xff0c;可以通过构造单个锐角大小为 t t t 的直角三角形&#xff0c;利用勾股定理和三角函数进行代换。 平方和的情况 形如 ∫…

java学习----注释

简介 override介绍&#xff1a; 添加了这个注释其实是做了个语法校验的作用 override定义 Deprecated介绍&#xff1a; 源码&#xff1a; SuppressWarnings介绍&#xff1a; 源码&#xff1a; 元注解 Retention注解介绍&#xff1a; 案列 Target注解介绍&#xff1a; Documente…

LLM - 理解 Transformer 的位置编码 sin cos 的作用与原理

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/140697827 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Transformer 模型中的位置编码是关键技术,通过为每个词嵌入向量添加位…

数据库第五次作业

1. 触发器 建立触发器&#xff0c;订单表中增加订单数量后&#xff0c;商品表商品数量同步减少对应的商品订单出数量,并测试 建立触发器&#xff0c;实现功能:客户取消订单&#xff0c;恢复商品表对应商品的数量 建立触发器&#xff0c;实现功能:客户修改订单&#xff0c;商品…

【微软蓝屏】微软Windows蓝屏问题汇总与应对解决策略

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

2024年铜川宜君半程马拉松,暴晒+爬坡152安全完赛

1、赛事背景 2024年7月21日&#xff0c;我参加了2024年铜川宜君半程马拉松赛&#xff0c;7月举办的赛事很少&#xff0c;全国都算温度比较高的&#xff0c;虽然宜君是一个山城&#xff0c;还是会担心气温会高。 临开赛1、2周&#xff0c;陕西区域降水比较多&#xff0c;赛前一…

【算法专题】双指针算法之LCR 179. 查找总价格为目标值的两个商品(力扣)

欢迎来到 CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;双指针算法之LCR 179. 查找总价格为目标值的两个商品&#xff08;力扣&#xff09; &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法…

使用nginx解决本地环境访问线上接口跨域问题

前言 前端项目开发过程中&#xff0c;经常会遇到各种各样的跨域问题。 虽然大部分时候&#xff0c;由脚手架自带的proxy功能即可解决问题&#xff0c;如webpack&#xff0c;vite等&#xff1b;但是若没有通过脚手架搭建项目&#xff0c;或者必须使用某些特殊规则转发时&#…

了解光耦合器从基础到应用

光耦合器也称为光电耦合器&#xff0c;是一种利用光信号传递电信号的电子元器件。它广泛应用于各种电子设备和电路中&#xff0c;因其在隔离电气信号、提高抗干扰能力方面的独特优势&#xff0c;备受工程师们的青睐。本文将为光耦爱好者和高级工程师提供一份有关光耦合器的知识…

解锁人工智能学习中的数学密钥

一、启航&#xff1a;奠定数学基础 1. 线性代数&#xff1a;AI的入门语言 学习目标&#xff1a;掌握向量、矩阵的基本概念及运算&#xff0c;理解线性空间、线性变换及特征值、特征向量的意义。学习建议&#xff1a;从基础教材入手&#xff0c;如《线性代数及其应用》&#x…

企业级视频拍摄与编辑SDK的全面解决方案

视频已成为企业传播信息、展示品牌、连接用户的重要桥梁&#xff0c;如何高效、专业地制作高质量视频内容&#xff0c;成为众多企业面临的共同挑战。美摄科技&#xff0c;作为视音频技术领域的创新先锋&#xff0c;以其强大的视频拍摄与编辑SDK&#xff0c;为企业量身打造了一站…

Sip for Mac:强大的屏幕取色软件

Sip for Mac是一款功能强大的屏幕取色工具软件&#xff0c;专为设计师、开发者和创作者打造。这款软件以其精准的取色功能和丰富的颜色管理选项而备受好评。 Sip的核心功能是提供多种取色工具&#xff0c;包括拾色器、取色板和屏幕取色等&#xff0c;使用户能够轻松地从屏幕上…

分享几种电商平台商品数据的批量自动抓取方式

在当今数字化时代&#xff0c;电商平台作为商品交易的重要渠道&#xff0c;其数据对于商家、市场分析师及数据科学家来说具有极高的价值。批量自动抓取电商平台商品数据成为提升业务效率、优化市场策略的重要手段。本文将详细介绍几种主流的电商平台商品数据批量自动抓取方式&a…

带哨兵位的双向循环链表

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 带哨兵位的双向循环链表 一、双向循环链表二、带哨兵位的的双向循环链表结构&#xff1f;2 双向循环链表接口函数的实现2.1 用于调试打印链表的接口函数2.2 双向循环链表的初…

【C++指南】类和对象(下)

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注

探索贝塞尔曲线:计算机图形学中的关键技术

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 贝塞尔曲线是计算机图形学和设计领域中的重要工具。它们由皮埃尔贝塞…

Linux 查找命令

目录 1. 查看二进制文件 which 2. 查看指定文件 find ​2.1 文件名查找 2.2 文件大小查找 前面学习过的 Linux 命令&#xff0c;其实质是一个个的二进制可执行程序&#xff0c;与 Windows 系统中的 .exe 文件是一个意思。 1. 查看二进制文件 which 语法&#xff1a; w…

Origin制作线性拟合回归图

选中数据&#xff0c;点下方散点图 调整散点颜色 在分析中打开线性拟合回归 添加文本 显示上轴

【NPU 系列专栏 1.1 -- NPU TOPS 算力的计算方式】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 NPU 算力MAC 阵列简介MAC 阵列特点 MAC 阵列的结构MAC 阵列架构示例 MAC 阵列计算举例示例计算 TOPS 计算方法 NPU 算力 OpenCV 算法会消耗很大一部分自动驾驶芯片的算力&#xff0c;在车上堆摄像头的同时也需要堆TOPS&#xf…

卷积神经网络(二)-AlexNet

前言&#xff1a; AlexNet是2012年ImageNet竞赛冠军&#xff08;以领先第二名10%的准确率夺得冠军&#xff09;获得者Hinton和他的学生Alex Krizhevsky设计的,在ILSVRC-2010测试集上取得了top-1错误率37.5%,top-5错误率17.0%&#xff08;优于第二名的16.4%&#xff09;,明显优…