C++怎么求素数 C++判断质数的高效算法代码【练习】

发布时间 - 2026-01-24 00:00:00    点击率:
只需检查到√n即可,因若n有大于√n的因子,则必有小于√n的对应因子;循环边界用i≤(int)sqrt(n)或i*i≤n,避免浮点误差。

怎么用 sqrt 优化素数判断,避免超时

直接从 2 循到 n-1 判断整除,时间复杂度是 O(n),对单个数还行,但遇到多次调用或大数(比如 10⁶ 级别)就明显卡顿。核心优化点是:如果 n 有大于 sqrt(n) 的因子,那它一定同时有一个小于 sqrt(n) 的对应因子。所以只需检查到 sqrt(n) 即可。

注意:sqrt(n) 返回浮点数,循环边界要用 i (sqrt(n)) + 1 或更稳妥的 i * i (避免浮点误差和类型转换开销)。

  • n == 1 要特判返回 falsen == 2 是唯一偶质数,要单独返回 true
  • 可以先排除所有偶数(除了 2),后续只试奇数,再省一半时间
  • sqrt 中,记得包含

写一个通用的 is_prime 函数要注意哪些边界

常见错误不是算法错,而是没处理好小数字和负数。C++ 标准里「质数」定义是大于 1 的自然数,所以 n 必须返回 falsen == 2 返回 truen % 2 == 0n != 2 就直接 false

示例代码片段:

bool is_prime(int n) {
    if (n <= 1) return false;
    if (n == 2) return true;
    if (n % 2 == 0) return false;
    for (int i = 3; i * i <= n; i += 2) {
        if (n % i == 0) return false;
    }
    return true;
}
  • 不要用 double s = sqrt(n); for (int i = 3; i —— sqrt 可能因精度丢位,比如 n == 2147395600(=46340²)时,sqrt 可能算成 46339.999,转 int 后变 46339,漏掉关键因子
  • i * i 安全,但注意 i * i 可能溢出(尤其 n 接近 INT_MAX),此时应改用 i

需要批量判断 1~N 内所有素数?用埃氏筛还是线性筛

如果只是判断几个数,用上面的 is_prime 就够了;但如果要查 1~10⁶ 范围内全部素数(比如做预处理、打表),就得上筛法。埃氏筛(std::vector 实现)写起来简单、内存友好,时间复杂度 O(N log log N),对 10⁷ 以内足够快。

线性筛(欧拉筛)能做到 O(N),但常数大、代码稍长,且只有在需要「记录每个数最小质因子」或严格卡常时才值得换。

  • 埃氏筛记得从 i*i 开始标记,不是从 2*i —— 前者避免重复标记,后者会多做很多无用操作
  • 数组大小设为 N+1,索引直接对应数值,prime[0]prime[1] 初始化为 false
  • 筛完后遍历一遍数组就能收集所有素数,不用额外维护列表

long long 判断大数时为什么容易出错

nlong long 类型(比如 10¹² 级别),上面的 i * i 会溢出 —— iint,乘出来还是 int,结果截断。必须统一用 long long 类型变量做循环和乘法。

同时,sqrt(n)long long 不安全(sqrt 没有 long long

重载,会转成 double,而 double 只有 53 位有效精度,无法精确表示大于 2⁵³ 的整数)。

  • 正确做法:用 long long i = 3; i —— 除法不会溢出,且语义清晰
  • 别忘了 n 本身可能是 long long,函数参数得声明为 long long n
  • 对于 >10¹⁴ 的数,单靠试除已不够,得考虑 Miller-Rabin 等概率算法,但那是另一层复杂度了

实际写的时候,最常被忽略的是小值特判和整数溢出边界——尤其是从 int 切换到 long long 时,循环变量类型、乘法、比较操作都得同步改,漏一个就跑错。


# 显卡  # c++  # 质数  # int  # 循环  # 算法  # 浮点  # 只需  # 是从  # 的是  # 那是  # 就能  # 遍历  # 设为  # 一遍  # 要注意 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 浅谈redis在项目中的应用  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  个人网站制作流程图片大全,个人网站如何注销?  ,在苏州找工作,上哪个网站比较好?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  如何在阿里云购买域名并搭建网站?  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  如何快速生成ASP一键建站模板并优化安全性?  如何快速配置高效服务器建站软件?  高端企业智能建站程序:SEO优化与响应式模板定制开发  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  Android okhttputils现在进度显示实例代码  BootStrap整体框架之基础布局组件  微信小程序 require机制详解及实例代码  如何快速搭建自助建站会员专属系统?  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  Laravel中的withCount方法怎么高效统计关联模型数量  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  如何确认建站备案号应放置的具体位置?  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  EditPlus中的正则表达式 实战(1)  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  如何用y主机助手快速搭建网站?  如何选择PHP开源工具快速搭建网站?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  活动邀请函制作网站有哪些,活动邀请函文案?  Android中AutoCompleteTextView自动提示  如何实现建站之星域名转发设置?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  教你用AI润色文章,让你的文字表达更专业  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel如何自定义分页视图?(Pagination示例)  SQL查询语句优化的实用方法总结  Linux系统命令中screen命令详解  高端网站建设与定制开发一站式解决方案 中企动力  青岛网站建设如何选择本地服务器?  如何自定义建站之星网站的导航菜单样式?  phpredis提高消息队列的实时性方法(推荐)  如何快速登录WAP自助建站平台?  进行网站优化必须要坚持的四大原则  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  如何使用 jQuery 正确渲染 Instagram 风格的标签列表