素数个数 埃式筛 欧拉筛

news/2024/11/14 13:43:50/文章来源:https://www.cnblogs.com/PeachyGalaxy/p/18542947

求 1 ~ 1e7 以内素数的个数

最普通做法(非常超时

int n;
bool judge(int x)
{if(x == 1) return false;for(int i = 2; i < x; i++){if(x % i == 0) return false;}else return true;
}
int main()
{cin >> n;int count = 0;for(int i = 2; i < n; i++){if(judge(i)) count++;}cout << count;
}

普通做法(超时

//与上面不同的是将judge函数中的搜索范围减少
bool judge(int x)
{if(x == 1) return false;for(int i = 2; i <= x / i; i++)  //循环中的结束条件更改了{if(x % i == 0) return false;}else return true;
}
//更改方法1: i <= sqrt(x)         sqrt函数速度慢,每次循环都会计算一次;开根号可能有精度误差
//更改方法2: int num = sqrt(x)    i <= num  这样只用计算一次sqrt(x)
//更改方法3: i * i <= x           不用sqrt也没有精度误差,但是当i特别大时,i * i可能会溢出变为负数
//更改方法4: i <= x / i           用除法速度可能较慢,但是数据很大时建议使用

埃式筛法(快

核心
筛去得到的素数的倍数 -> 合数
实现筛去
用一个bool类型的数组 或者 bitset(会慢几十ms)来存储每个值是否是素数,当前素数的倍数则是true,后续的遍历只有满足false的条件(即未被筛去)才能进行
不足
一个元素可能会重复筛去,因为它同时是几个素数的倍数
例如
i = 2时,会筛掉4,6,8,10,12,14....
i = 3时,会筛掉9,12....
这里12就筛重复了(这是已经改进了一点的结果,没改进之前,int j = i * 2,重复筛掉的就更多,例如6)

  • 利用了3个for,但是重复筛去的数据更少,1e6的数据平均在15ms
const int N = 1e7 + 10;
bool judge[N];  //bitset<N> judge;  初始化都为false
int n;
int main()
{cin >> n;int count = 0;for(int i = 2; i <= n / i; i++){if(!judge[i]) for(int j = i * i; j < n; j += i) judge[j] = true;   //j = i * 2 稍微慢了一点}for(int i = 2; i <= n; i++){if(!judge[i]) count++;}cout << count;
}
  • 利用2个for,但是重复筛去的元素更多,1e6的数据平均在15ms(时间波动有点大)
const int N = 1e7 + 10;
bool judge[N];  //bitset<N> judge;  初始化都为false
int n;
int main()
{cin >> n;int count = 0;for(int i = 2; i <= n; i++){if(!judge[i]) {count++;for(int j = i * 2; j <= n; j += i) judge[j] = true;   //这里相比上面,int j 不能初始化为i * i,会溢出;并且当 i > sqrt(n) 时仍然会筛掉元素,但是这些元素肯定已经被小于sqrt(n)的数给筛过了}}cout << count;
}

欧式筛法(最快

核心
合数 = 最小的素数 * 另一个数,只有prime[j]是最小的质因数时i才能被筛掉
例如 24 = 3 * 8 = 3 * 2 * 2 * 2 = 2 * 12,要在另一个数为12时才能筛掉,不然就会重复
1e6数据的时间<10ms
核心代码

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

代码实现

#include <iostream>using namespace std;
const int N = 1e6 + 10;
int prime[N];
bool judge[N];int main()
{int n = 1e6, k = 0;for(int i = 2; i <= n; i++){if(!judge[i]) prime[k++] = i;for(int j = 0; j < k; j++) {if(i * prime[j] > n) break;judge[i * prime[j]] = true;if(i % prime[j] == 0) break;}//建议多列一串数字寻找原理,或者记下来}cout << k;
}

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

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

相关文章

大厂SSP的Java学习路线

大厂SSP的Java学习路线,零基础,分阶段,极简的自学编程指南,全网最全面最贴心 小厂(入门阶段)怎么学,中厂(进阶阶段)怎么学,大厂(高级阶段)怎么学现在互联网环境这么差,Java还能学吗? 学Java还能找到工作吗? 大家好呀, 我是程序员回家养猪, 一个专升本, 三段实习经历拿…

章节一、Maven学习

一、maven介绍 1、简介 Maven是一个项目管理工具(构建工程、管理jar包、编译代码、完成测试、项目打包) Maven是基于POM(project object model 项目对象模型)实现的 Maven标准化了项目结构 Maven提供了一个免费的中央仓库 开源jar包 Maven是跨平台的 2、作用 一键构建:编译…

[GYCTF2020]Blacklist 1

[GYCTF2020]Blacklist 1 打开实例发现get提交框,提交1发现显示尝试万能密码无果尝试联合注入,显示出了过滤规则,可以见到很多关键字都被过滤了尝试堆叠注入,成功显示出数据表 ?inject=1;show databases;查表 ?inject=1;use ctftraining;show tables;看到了个FLAG_TABLE查…

Serverless GPU:助力 AI 推理加速

本文将探讨云原生 Serverless GPU 如何从根本上解决这些问题,以实现 AI 技术的高效落地。本文整理自 2024 云栖大会,阿里云智能集团高级技术专家聂大鹏、NVIDIA 解决方案架构师金国强演讲议题《Serverless GPU:助力 AI 推理加速》 近年来,AI 技术发展迅猛,企业纷纷寻求将 …

HyperWorks的shrink warp meshing

在HyperWorks中,针对某些具有复杂几何特征的零部件的网格剖分,Altair HyperMesh 向用户提供了一种名为 Shrink Warp Meshing 的技术,快捷高效地完成有限元模型前处理工作。例如在车辆碰撞分析研究中,用户可以使用 Shrink Warp Meshing 技术快速构建诸如传动系统等(具有复杂…

快速了解电源模块的使用方法 BDB10-12W系列电源模块

快速了解电源模块的使用方法 BDB10-12W系列电源模块电源是整个电路可靠工作的核心部分。然而,由于电源电路的电流和发热量较大,容易出现故障。今天我为大家介绍一下电源模块的使用方法。BOSHDIA电源模块是将电源电路集成到一个很小的PCB板上,从而实现输出稳定电压和大电流的…

GSDml结构

1. 如何方便的看到GSDml的结构在github上找到一个很好用的开源工具以及它的开源汉化,叫xml notepad,可以很好的看到设备树视图。 [2.9.0.8官方下载地址] [汉化插件]2. 文件结构总体就是header和Body两个部分ISO15745Profile | +--ProfileHeader +--ProfileBody|+--DeviceIdent…

什么是CRM系统?CRM系统在企业中扮演什么角色?

近年来,客户关系管理(CRM)系统逐渐显露头角,成为企业把握航向、驶向成功的关键。也有好多人来问关于这方面的问题,所以专门开一篇文章为大家深入了解CRM系统的含义、功能、价值以及它在现代企业中的实际应用,为的呀就是帮助大家全面把握这一概念。 一、CRM系统是什么? 客…

运行 MainApplication 时出错 运行 MainApplication 时出错。命令行过长。 通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行

运行springboot的启动类时,报了这个错。 解决办法: 1、修改选项2、添加缩短命令行项3、选择JAR清单

python 垃圾回收

引用计数器#define PyObject_HEAD PyObject ob_base; #define PyObject_VAR_HEAD PyVarObject ob_base;// 宏定义,包含 上一个、下一个,用于构造双向链表用。(放到refchain链表中时,要用到) #define _PyObject_HEAD_EXTRA \struct _object *_ob_next;标记清除 分…

作业4

作业①: 要求: 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。 候选网站:东方财富网:http://quote.eastmoney.com/center/gridlist…

采集opc da 转 profinet IO项目案例

VFBOX协议转换网关支持PLC,modbus,EthernetIP,Profinet,CCLink,EtherCAT,IEC61850,IEC104,bacnet,DLT645,HJ212,opc ua,opc da,DNP3。目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 应用条件 2 4 查看OPC DA服务器的相关参数 2 5 配置网关采集opc da数据 4 6 用prof…