当前位置: 首页 > news >正文

质数筛-欧拉筛

对于正常的程序要求,埃氏筛的速度已经是相当不错了,但是在某些极端条件下,埃氏筛的速度可能还不够,这个时候我们就要用到欧拉筛了

思路

埃氏筛存在一个非常严重的缺陷,那就是它会对一个数据进行反复筛选,比如:

6 = 2 * 3

6 = 3 * 2

可以发现,对于 6 这个非质数,我们进行了两次筛选,而对于后面跟大的数来说,可能被筛的次数会更多,这个时候就会对我们筛法的效率产生影响。而欧拉筛法可以避免无效的筛选。

我们发现,对于每个非质数,都会存在唯一的最小质因子。

于是我们便可以让每个和数只在它最小质因子与对应因数相乘时才被标记为合数,这样我们就只筛了一次。例如:

6 = 2 * 3 //标记 6

6 = 3 * 2 //已经标记过,便不再标记

核心思想:从第一个质数开始,一个个排除,不做无效的筛选。

人话:从前向后走,边走边乘,乘出来的数就是合数

代码实现

#include<iostream> #include<cstring> using namespace std; const int N = 1e5; int primes[N]; //存储质数 int flag[N]; //标记是质数还是合数,如果是质数为 0 ,开始假设全是质数 int main(){ int n; cin >> n; int pos = 0; for(int i = 2 ; i <= n ; i++){ if(flag[i] == 0){ //如果是质数 primes[pos++] = i; //存储质数 for(int j = 0 ; j < pos && i * primes[j] <= n ; j++){ flag[primes[j] * i] = 1;//标记为合数 } }else{ //如果是合数 for(int j = 0 ; j < pos && primes[j] * i <= n ; j++){ flag[primes[j] * i] = 1;//标记为合数 if(i % primes[j] == 0) break; //如果可以整除说明发现了最小质因子,退出循环 } } } for(int i = 0 ; i < pos ; i++){ cout << primes[i] << ' '; } cout << endl; return 0; }
http://www.cnnetsun.cn/news/169633.html

相关文章:

  • [Java]PTA:jmu-Java-06异常-finally
  • 9、高级 Active Directory 配置与复制管理全解析
  • Magistral-Small-1.2:多模态推理新升级
  • 6、Windows 操作系统架构与网络通信详解
  • 7、Windows网络与RPC编程全解析
  • 9、RPC 通信基础设施设计与实现
  • 15、Windows管道通信:命名管道与匿名管道详解
  • 16、Windows NT 中的命名管道与邮件槽通信技术详解
  • 25、网络编程中的Windows NT技术解析
  • Linly-Talker如何确保用户上传肖像的安全性?
  • Qwen3Guard-Stream-4B:流式三级实时风险监测
  • Linly-Talker支持暗黑主题UI界面吗?
  • Linly-Talker在高校招生宣传中的创新应用案例
  • Linly-Talker支持多轮对话上下文理解吗?
  • Gemma 3 270M:轻量级多模态文本生成模型
  • Linly-Talker镜像提供SLA服务保障承诺
  • python django flask中小学生成长考勤档案管理系统的设计与实现_a028i958--论文
  • gpt-oss-120b量化版:低资源高性能推理
  • 5、计算机系统的多维度剖析:从基础组件到应用环境
  • 大模型学习基础(六) 强化学习(Reinforcement Learning,RL)初步1.4
  • 腾讯混元3D-Part:AI驱动3D部件智能生成与分割
  • 6、DevOps环境的运营能力与技能需求
  • 8、SQL Server 数据存储与性能监控指南
  • 12、PowerShell远程处理:端点配置与故障诊断
  • 21、Windows PowerShell:技术与业务价值的完美融合
  • 66、优化Windows计算机性能全攻略
  • Step3:321B参数多模态推理新标杆
  • ByteFF2:量子力学驱动的通用力场模型
  • Linly-Talker能否用于法律咨询助手?律师团队试用反馈
  • Linly-Talker支持移动端适配吗?答案在这里