筛质数(线性筛法)

线性筛法:

假设有一个非质数 x,那么这个数可以被表示为一个最小质因数和一个因子相乘的形式

x = 12 ,那么 x = 2*6

其中:2 就是 12 的最小质因数, 6 就是另一个因子

线性筛法就是利用每个数的最小质因数筛掉这个非质数,如12就要用2筛掉,18就要用3筛掉

step1:

遍历2-n之间的所有数,一是为了遍历2-n之间的所有的质数,二也是为了找到和质数相乘的另一个数。

step2:

将质数(没有被筛掉的数就是质数)加入到primes数组中。

step3:

遍历primes数组,从小到大遍历所有2-n之间的质数(要满足这个质数和另一个因数相乘的值要小于n)

step4:

primes[j]筛去  i *primes[j]  这个数

step5:


因为primes数组记录质数是从小到大记录的质数,因此直到 i % primes[j] == 0primes[j]都是

i * primes[j] 这个数的最小质因数,当 i%primes[j] == 0 时,下一次的primes[j+1] 就不是 i* primes[j]的最小质因数了,所以要break

 

 题目如下:

给定一个正整数 n,请你求出 1∼n 中质数的个数。

输入格式

共一行,包含整数 n。

输出格式

共一行,包含一个整数,表示 1∼n 中质数的个数。

数据范围

1≤n≤106

解答代码如下:

#include<iostream>
#include<cstring>using namespace std;const int N = 1000010;int primes[N];
bool st[N];
int n,cnt;int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n;//线性筛法的宗旨就是只能以一个非质数的最小质因子去筛一个非质数//如12 = 2*2*3,它的最小质因子就是2,因此,12只能被2筛掉,也就是以st[2*6]的方式筛掉//而不是以st[3*4]的方式筛掉for (int i = 2;i<=n;++i)//列举所有2-n之间的数//n = a * b//a代表n的最小质因数,b代表另一个因子//如12的最小质因数就是2,那么12 = 2 * 6//这里的a就是2,b就是6//这里遍历2-n之间的所有数,既是为了找到2-n之间的每个数的最小质因数//也是为了找到和最小质因子相乘的另一个数,如12 = 2*6中的6{if (st[i] == false)primes[cnt++] = i;//在指数的数组中加入数组//没有被标记为非质数的数就是质数for (int j = 0;primes[j] <= n/i;++j)//从小到大遍历所有的质数,找到满足primes[j]*i <=n的质数{st[primes[j] * i] =true;//因为是从小到大遍历的质数,因此此时的primes[j]一定是primes[j]*i //这个数的最小质因子,那么就用primes[j]这个最小质因子去把primes[j]*i这个数筛掉if (i%primes[j] == 0)//这一句话的作用,是保证每个数都是被自己的最小质因数筛掉,且只会被筛一次//如果i % primes[j] != 0://说明primes[j]不是 i 的最小质因数,//且primes[j]一定小于i的最小质因数,因为primes[j]是从小到大遍历的所有质数//那么primes[j]就一定是primes[j]*i 的最小质因数//可以这么看primes[j]*i = primes[j]*(i的质因数乘积式),如果primes[j]小于//i的任何一个质因数,那么primes[j]就一定是primes[j]*i的最小质因数//这样的话,primes[j+1]的最坏结局就是i%primes[j+1] == 0//也就是primes[j+1]是i的最小质因数,那么primes[j+1]*依然可以由primes[j+1]来筛掉//但是对于primes[j+2]而言,primes[j+2]就不会是primes[j+2]*i的最小质因数了//因此,,如果i % primes[j] == 0,说明下一次循环到的primes[j+1]就不会是//primes[j+1]*i的最小质因数了,所以要break//如果i % primes[j] != 0,说明下一次循环到的primes[j+1]一定会是primes[j+1]*i的最小质因数//(这里的一定是最小质因数分两种情况://1.primes[j]小于i的最小质因数,那么primes[j]是primes[j]*i的最小质因数了//2.primes[j]等于i的最小质因数,那么primes[j]是primes[j]*i的最小质因数)//所以 i % primes[j] != 0不用break;break;}}cout << cnt ;return 0;
}

 (1)为什么要for (int j = 0;primes[j] <= n/i;++j)

因为这个循环的目的是为了筛掉小于 n 的非质数(剩下的就是质数),而这个非质数是用 i * primes[j] 来确定的,因此,如果 primes[j] * i > n 的话,那么筛掉的非质数就不是小于 n 的了

 

(2)if(i % primes[j] == 0)break; 

 这一语句是保证每一个非质数是被它的最小质因数筛掉的。看代码中的注释

 

(3)模拟过程

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

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

相关文章

解决idea始终无法导入本地jar包

问题描述 maven刷新也没有用 解决&#xff1a; 找到本地Maven仓库的jar包手动引入 之后。导入成功

《黑神话:悟空》研发公司的薪资水平

作者&#xff1a;程序员晓凡 最近全网最火爆的要属《黑神话&#xff1a;悟空》了&#xff0c;即便是我这个平时不沾游戏、不追直播的人&#xff0c;也看直播看得津津有味。 一、销量与热度背后 首先&#xff0c;让我们来看看那些令人瞩目的数字。《黑神话&#xff1a;悟空》…

VBA技术资料MF194:屏蔽右键菜单

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

uniapp(微信小程序如何使用单选框、复选框)

一、先看效果 二、数据结构 说明&#xff1a;selected用来记录每次用户选择的值&#xff0c;当是单选的时候属性中的selected属性需要设置成字符串&#xff0c;当是复选框的时候&#xff0c;此时选择的是数组&#xff0c;selected属性应设置为数组。type用来区分当前是单选还是…

Wordpress 6.x 修改文件上传大小限制

1. 安装并启用Big File Uploads插件 插件 → 安装新插件 媒体→添加文件 修改后Save保存 2. 修改Nginx配置文件 # 我的配置在wordpress.conf文件中 vim /etc/nginx/conf.d/wordpress.conf 在server节点中加入下面这句配置 # 文件上传大小限制 client_max_body_size 500M;# 重…

xss-labs通关攻略 11-15关

第十一关&#xff1a;less-11 步骤一&#xff1a;利用burp抓包 步骤二&#xff1a;添加referer:click me!" type"button" οnmοuseοver"alert(/xss/)进行放包 第十二关&#xff1a;less-12 步骤一&#xff1a;利用burp抓包 步骤二&#xff1a;修改User A…

java 中的设计模式

文章目录 一、前言二、设计模式的分类三、设计模式的原则1、开闭原则&#xff08;Open Close Principle&#xff09;2、里氏代换原则&#xff08;Liskov Substitution Principle&#xff09;3、依赖倒转原则&#xff08;Dependence Inversion Principle&#xff09;4、接口隔离…

【计算机系统架构】从0开始构建一台现代计算机|时序逻辑、主存储器|第2章

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024往期回顾&#xff1a; 【计算机系统架构】从0开始构建一台现代计算机|二进制、布尔运算和ALU|第2章每日一言&#x1f33c;: 孤独和喧嚣都令人难以忍受。如果一定要忍…

参会投稿 | 第三届先进传感与智能制造国际学术会议(ASIM 2024)

第三届先进传感与智能制造国际会议&#xff08;The 3rd International Conference on Advanced Sensing, Intelligent Manufacturing&#xff09;&#xff0c;由江汉大学、西安交通大学和山东大学主办&#xff0c;由江西省机械工程学会、东华理工大学机械与电子工程学院等联合协…

iPhone突然黑屏?别慌,这里有你的自救指南

在日常使用iPhone的过程中&#xff0c;不少用户可能会遇到手机突然黑屏的情况&#xff0c;这往往让人措手不及。别担心&#xff0c;今天我们就来详细探讨一下iPhone突然黑屏的可能原因及解决方法&#xff0c;帮助你快速恢复手机的正常使用。 一、iPhone突然黑屏的可能原因 1. …

IPD+敏捷高级训战盛典(上海站)圆满落幕,引领创新管理新纪元

在金秋送爽的八月末&#xff0c;翰德恩咨询精心筹备的为期两日的“IPD敏捷高级训战盛典&#xff08;上海站&#xff09;”于24日至25日璀璨落幕&#xff0c;标志着一场汇聚行业精英、融合前沿管理智慧的盛宴圆满收官。此次盛典不仅是知识的碰撞与交融&#xff0c;更是企业转型升…

序列化组件对比

1、msgpack介绍 1.MsgPack产生的数据更小&#xff0c;从而在数据传输过程中网络压力更小 2.MsgPack兼容性差&#xff0c;必须按照顺序保存字段 3.MsgPack是二进制序列化格式&#xff0c;兼容跨语言 官网地址&#xff1a; https://msgpack.org/ 官方介绍&#xff1a;Its lik…

ST表(区间查询

解决的问题&#xff1a; 数组区间查询最大值和最小值对于解决数组的树状数组的区间修改 ------- 线段树倍增思想 核心代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N1e5; int num[N]; int f[N][N]; int main(){int n;cin>>n;//输入默…

Vue 2.x时间转换为北京时间(+8)

文章目录 当前时间格式效果图理想时间格式效果图转换方法总结 当前时间格式效果图 非中国常用时间格式&#xff0c;在上图中给可以看到&#xff0c;选择的时间为&#xff1a;2024-8-26 ~ 2024-8-27&#xff0c;返回结果却是&#xff1a;2024-08-25TXX:XX:XXZ&#xff0c;明显不…

最大噪音值甚至受法规限制,如何基于LBM算法有效控制风扇气动噪音

风扇的气动噪声 在工业设备行业&#xff0c;最大噪音值受法规限制。在很多使用风扇冷却的设备上&#xff0c;风扇噪声通常是这些设备工作噪声的最大贡献量。而在家电民用行业&#xff0c;例如空调、空气净化器、油烟机等&#xff0c;其噪音大小直接关系到用户的体验感受&#x…

实现并发网络服务器

一&#xff0c;网络服务器 1.单循环网络服务器 —— 同一时刻只能处理一个客户端任务 2.并发服务器 —— 同一时刻能处理多个客户端任务 二&#xff0c;并发服务器 1.多线程 2.IO多路复用 3.多进程 三&#xff0c;IO模型 1.阻塞IO 阻塞IO&#xff08;Blocking IO&…

SQLi-LABS通关攻略【41-45】

SQLi-LABS 41关 这一关是堆叠注入 测试闭合 ?id1 //回显错误 ?id1-- //回显错误 ?id1-- //回显正确 所以是数字型的注入 测试堆叠注入&#xff0c;更改Dumb的密码 ?id1;update users set password123456 where usernameDumb-- SQLi-…

不会PS怎么快速抠图?试试这3种方法,抠图干净又高效!

我就不信每个人都会用PS抠图&#xff01;&#xff01; 关于抠图技巧&#xff0c;前面高赞已经分享了好多&#xff0c;但&#xff0c;我还是忍不住想向所有小白推荐更“傻瓜式”抠图。 就是那种根本不需要学习就能抠干净的抠图工具&#xff0c;适用于99%的抠图需求&#xff0c…

【数字时序】时钟树延迟偏差——CPPR adjustment

接上一篇文章Innovus的时序报告解读&#xff0c;新版的貌似多了一些信息&#xff0c;比如CPPR Adjustment和Derate。不太清楚这两个是什么概念&#xff0c;搜索之后转载2篇后端工程师的博客如下&#xff1a; 搜到个这个网站好像有很多后端相关的知识点分享一哈&#xff1a; Co…

springboot+vue+mybatis计算机毕业设计电子产品交易系统+PPT+论文+讲解+售后

系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对电子产品交易管理的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”…