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,一经查实,立即删除!

相关文章

【0-1 架构问题集合】

常见问题 大数据量高并发情况下如何更新缓存二级目录三级目录 大数据量高并发情况下如何更新缓存 首先是查询的时候&#xff0c;一般先查询缓存&#xff0c;在查询数据库&#xff0c;同步的去更新缓存但是都是异步去更新&#xff0c;引入消息队列MQ 本质是个队列&#xff0c;F…

JVM之经典垃圾收集器

目录 Serial收集 ParNew收集器 Parallel Scavenge收集器 Serial Old收集器 Parallel Old收集器 CMS垃圾收集器&#xff08;重点&#xff09;&#xff1a; Garbage First 收集器&#xff08;重点&#xff09;&#xff1a; Serial收集 使用一个处理器或一条收集线程去完成垃…

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

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

Java高级工程师应该怎样准备笔试?

哈哈&#xff0c;大早上&#xff0c;有个粉丝问&#xff1a;Java高级工程师应该怎样准备笔试&#xff1f; 这问题还真是小意思啊。Java高级工程师的笔试怎么准备&#xff1f;你问得好&#xff01;咱们混迹江湖这么久&#xff0c;什么风浪没见过&#xff0c;面试笔试这些东西&a…

Java:swagger/knife4j接口返回的json数据中文显示乱码问号???

目录 问题描述问题解决参考文章 问题描述 正常接口的中文返回是正确的 而只要发生异常处理&#xff0c;就会使用全局统一异常处理&#xff0c;输出包含中文字符的json字符串&#xff0c;发现&#xff0c;全都变成了问号?????? /*** 统一异常处理*/ ControllerAdvice Sl…

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;…

分布式:保证分布式事务的一致性

文章目录 保证分布式事务的一致性XA协议两阶段提交TCC模式SAGA模式 本篇开始进行分布式的学习&#xff0c;由于时间原因&#xff0c;我也没有过多时间深入学习&#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;为企业量身打造了一站…

cmake 常用功能解析

cmake_minimum_required(VERSION 3.1) # 声明要求的 cmake 最低版本# 设置项目名称 和编程语言 project(yolov8 LANGUAGES CXX CUDA)set(CMAKE_CUDA_ARCHITECTURES 60 61 62 70 72 75 86 89 90) # 通过 CMake 设置架构版本号 set(CMAKE_CUDA_COMPILER /usr/local/cuda/bin/n…

1.Spring Boot 简介(Spring MVC+Mybatis-plus)

文章目录 一&#xff0c;Spring Boot 简介二&#xff0c;搭建springboot项目并整合mybatis-plus框架1.pom导依赖2.添加启动项3.配置文件.yml 三&#xff0c;springboot集成 Spring MVC1.springmvc定义2.应用注解 一&#xff0c;Spring Boot 简介 SpringBoot是Spring的子工程(或…

AI回答:C#中异步方法获得列表后的Result方法探讨

【代码】 (await _xxxrepository.GetListAsync()).First(); await _xxxrepository.GetListAsync().Result.First(); 【区别分析】&#xff1a; 第一行&#xff1a; (await _xxxrepository.GetListAsync()).First(); 评价&#xff1a;一旦异步方法完成并返回结果&#xff0c;使…

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

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