c++怎么判断一个数是否为素数_c++求质数算法【实战】-C++

素数判断需先处理边界:n

判断一个数是否为素数:从边界条件开始检查

小于2的数(如0、1、负数)直接不是素数,这是最容易忽略的起点。C++中int类型输入若未校验,is_prime(-5)或is_prime(1)返回true就是典型错误。

  • 必须先判断 n ,立即返回 false
  • n == 2 是唯一偶素数,需单独返回 true
  • n % 2 == 0 && n != 2 的情况直接返回 false

优化试除法:只遍历到 sqrt(n)

对正整数n,若它有大于sqrt(n)的因子,则必有一个对应的小于sqrt(n)的因子。因此循环上限设为(int)sqrt(n)或更安全的i * i ——后者避免浮点误差和#include 依赖。

  • 用 for (int i = 3; i * i ,跳过所有偶数
  • 注意 i * i 可能溢出(尤其n接近INT_MAX),此时应改用 i
  • 不要写 i :多次调用sqrt低效,且sqrt返回double可能因精度丢位(如sqrt(25)返回4.999999导致循环少一次)

处理大数或多次查询:考虑简单预处理

单次判断用试除法足够;但若需在[2, 10⁵]范围内频繁查素数(比如做1000次is_prime(x)),埃氏筛更高效。不过别一上来就写筛法——它空间开销固定,对稀疏查询反而浪费。

  • 小范围(n )且查询密集:用vector is_prime(N+1, true) + 埃氏筛预处理
  • 大n(如10⁹量级):试除法仍是首选,但需加6k±1优化(跳过所有2、3的倍数)
  • 注意vector是特化容器,某些编译器下operator[]非O(1)原子访问,多线程需额外同步

常见错误与陷阱:溢出、类型、逻辑短路

看似简单的函数,实际在线上环境常因细节崩掉。比如is_prime(2147483647)(INT_MAX)在32位机上跑i * i 会因i递增到46341时i*i溢出成负数,导致无限循环。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » c++怎么判断一个数是否为素数_c++求质数算法【实战】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3997510+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3997511+
  • 本周更新: 0+
  • 最后更新: 2026-03-16