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

57.Acwing基础课第868题-简单-筛质数

57.Acwing基础课第868题-简单-筛质数

题目描述

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

输入格式

共一行,包含一个整数\(n\)

输出格式

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

输出格式

数据范围
1≤\(n\)≤2×106

输入样例:

8

输出样例:

4

代码:

朴素筛法

// 包含输入输出流头文件,用于 cin 和 cout
#include <iostream>
// 这里没用到,可以省略
#include <algorithm>using namespace std;// 定义数组最大范围,能处理 1e6 以内的质数
const int N = 1000010;// primes[] 存储筛出来的所有质数
// cnt 记录质数的总个数
int primes[N], cnt;
// st[] 是标记数组,st[i] = true 表示 i 是合数,不是质数
bool st[N];// 朴素筛法:筛出 2 ~ n 之间的所有质数
void get_primes(int n)
{// 从 2 开始遍历到 nfor (int i = 2; i <= n; i ++ ){// 如果 i 没有被标记,说明 i 是质数if (!st[i]) primes[cnt ++ ] = i;  // 把质数存入 primes 数组,质数数量 +1// 核心:把当前数 i 的所有倍数都标记为合数(非质数)// j 从 i*2 开始,每次加 i,直到 nfor (int j = i + i; j <= n; j += i)   st[j] = true;  // 标记为合数}
}int main()
{int n;// 输入范围 n,求 2~n 之间有多少个质数cin >> n;// 调用筛法函数get_primes(n);// 输出质数的总个数cout << cnt << endl;return 0;
}

埃氏筛法

// 包含标准输入输出头文件(cin/cout依赖)
#include <iostream>
// 算法库(本代码未直接使用,属于通用模板保留)
#include <algorithm>// 使用std命名空间,避免重复写std::
using namespace std;// 常量定义:N为数组最大长度,1000010适配n≤1e6的场景(可根据需求调整)
const int N= 1000010;// 全局数组/变量(默认初始化为0/false,无需手动清零)
int primes[N];  // primes数组:存储筛选出的所有质数,primes[0]是第一个质数,primes[1]是第二个,依此类推
int cnt;        // cnt:记录质数的个数(primes数组的有效长度)
bool st[N];     // st数组:标记是否为合数(st[i]=true → i是合数;st[i]=false → i是质数)// 埃氏筛核心函数:筛选出1~n中的所有质数,存入primes数组,并统计个数cnt
// 核心思想:从小到大枚举数,若当前数是质数,则筛掉它的所有倍数(标记为合数)
void get_primes(int n)
{// 枚举2~n的所有数(1不是质数,无需处理)for (int i = 2; i <= n; i ++ ){// 若st[i]=false,说明i未被标记(是质数)if (st[i]) continue; // 跳过合数,只处理质数primes[cnt ++ ] = i; // 将质数i存入primes数组,同时cnt计数+1// 筛除质数i的所有倍数(从i*2开始,步长i),标记为合数// 原理:质数的所有倍数一定是合数,无需后续重复判断for (int j = i + i; j <= n; j += i)st[j] = true; // 标记j为合数}
}int main()
{int n; // n:输入的上限,要求筛选出1~n中的所有质数cin >> n; // 输入上限nget_primes(n); // 调用筛法函数,筛选1~n的质数cout << cnt << endl; // 输出1~n中质数的总个数return 0; // 程序正常结束
}

线性筛法(欧拉筛法,核心重点)

// 包含标准输入输出头文件(cin/cout依赖)
#include <iostream>
// 算法库(本代码未直接使用,属于通用模板保留)
#include <algorithm>// 使用std命名空间,避免重复写std::
using namespace std;// 常量定义:N为数组最大长度,1000010适配n≤1e6的场景(可根据需求调整)
const int N = 1000010;// 全局数组/变量(全局区默认初始化为0/false,无需手动清零,非常方便)
int primes[N];  // primes数组:存储筛选出的所有质数,primes[0]是第一个质数,依此类推
int cnt;        // cnt:记录质数的总个数(primes数组的有效元素个数)
bool st[N];     // st标记数组:st[i]=true → i是合数;st[i]=false → i是质数// 线性筛(欧拉筛)核心函数:筛选 2 ~ n 之间的所有质数
// 优点:每个合数只会被**最小质因子**筛掉一次,时间复杂度 O(n),效率最高
void get_primes(int n)
{// 从 2 开始遍历到 n,逐个判断每个数 ifor (int i = 2; i <= n; i ++ ){// 如果 i 没有被标记(st[i]=false),说明 i 是质数if (!st[i])primes[cnt ++ ] = i;  // 把质数 i 存入 primes 数组,质数计数 +1// 核心:遍历已找到的所有质数,标记合数// 条件 primes[j] <= n / i 是为了防止乘积超出数组范围,避免越界for (int j = 0; primes[j] <= n / i; j ++ ){// 标记 质数primes[j] * 当前数i 为合数st[primes[j] * i] = true;// 线性筛最关键的一步:保证每个合数只被最小质因子筛除// 如果 i 能被当前质数 primes[j] 整除,说明 primes[j] 是 i 的最小质因子// 此时必须 break,再往后就会重复标记,破坏线性复杂度if (i % primes[j] == 0) break;}}
}int main()
{int n;          // 定义变量 n:表示要筛选质数的上限(求 1~n 中的质数)cin >> n;       // 输入上限 nget_primes(n);  // 调用线性筛函数,筛选出 2~n 之间的所有质数cout << cnt << endl;  // 输出质数的总个数return 0;       // 程序正常结束
}
http://www.jsqmd.com/news/612529/

相关文章:

  • 开源技术创新实践:探索个性化黑苹果系统构建之旅
  • 突破平台限制:xmly-downloader-qt5的跨平台音频内容管理解决方案
  • cxxopts代码贡献终极指南:10个步骤掌握开源C++项目开发流程
  • 基于Python的供应商管理系统毕业设计源码
  • Cadence仿真进阶:共源极噪声分析的优化策略
  • 新产线设备选型必备:2026光罩型晶圆传感器供应商(厂家/公司)评估清单 - 品牌推荐大师
  • Qwen3-ASR-1.7B效果展示:复杂长难句+中英混说音频转写惊艳对比
  • 设备资产管理系统 + 工业软件集成:打通数据孤岛,释放智能运维新价值
  • Mujoco 学习系列(五)Menagerie模型实战:从导入到自定义仿真场景
  • 2026年4月打褶机批发厂家推荐,褶皱机/褶景机/多功能打皱机/电脑褶景机/多功能摺景机/服装压褶机,打褶机厂家哪家好 - 品牌推荐师
  • 深入解析CHID与HWID在Windows驱动推送中的协同机制
  • Nanbeige4.1-3B实战手册:600步工具调用能力在智能体开发中的应用
  • 长沙装修公司哪家好?2026年4月推荐评测口碑对比TOP5领先 - 品牌推荐
  • 电力电子杂论知识
  • 3步解决企业级Windows激活难题:管理员实战指南
  • 终极指南:R3nzSkin内存换肤技术的完整实现与实战进阶
  • 5步终极指南:让旧Mac重获新生,体验最新macOS的完整教程
  • Florence-2视觉模型在Inferentia2上的编译适配:Stage-wise拆分、Bucket策略与BF16优化的实现细节
  • FIREYE EUVS4火焰放大器模块
  • 阿里云盘Refresh Token获取工具:高效获取凭证,实现云盘自动化管理
  • 全流程解决方案:EdgeRemover让Microsoft Edge强制残留成为历史
  • 大麦网抢票神器DamaiHelper:从零开始掌握演唱会门票自动抢购
  • 企业AI平台优选指南:权威认证加持,适配多场景数智转型需求
  • 比迪丽Stable Diffusion教程:如何用ControlNet绑定角色姿势
  • BetterGenshinImpact多开终极指南:如何同时管理多个原神账号
  • Windows系统-应用问题全面剖析Ⅵ:德承工控机MD-3000在Windows操作系统下[卡顿/死机]的排查与解决方法 - Johnny
  • League-Toolkit:英雄联盟客户端全功能增强工具全面解决方案
  • 深入剖析JumpServer堡垒机CVE-2023-42820漏洞:从原理到修复
  • 终极指南:如何保护Dkron分布式调度系统的安全配置
  • 防护手套哪个品牌好? - 中媒介