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要特判返回false;n == 2是唯一偶质数,要单独返回true - 可以先排除所有偶数(除了 2),后续只试奇数,再省一半时间
-
sqrt在中,记得包含
写一个通用的 is_prime 函数要注意哪些边界
常见错误不是算法错,而是没处理好小数字和负数。C++ 标准里「质数」定义是大于 1 的自然数,所以 n 必须返回 false;n == 2 返回 true;n % 2 == 0 且 n != 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 判断大数时为什么容易出错
当 n 是 long long 类型(比如 10¹² 级别),上面的 i * i 会溢出 —— i 是 int,乘出来还是 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 风格的标签列表
下一篇:误把gitlab格式化了怎么办
下一篇:误把gitlab格式化了怎么办

