新闻中心
C++如何判断一个数是素数_C++质数判断的高效算法实现
判断素数的高效方法是检查2到√n间的因子。基础优化:n

判断一个数是否为素数(质数)是C++编程中的常见问题。素数是指大于1且只能被1和自身整除的自然数。最简单的实现方式是从2遍历到n-1,但效率极低。下面介绍几种高效且实用的C++实现方法。
基础优化:只检查到√n
一个合数必然有一个小于或等于其平方根的因子。因此,我们只需检查从2到√n之间的所有数即可。
bool isPrime(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;
}
这个版本跳过了所有偶数(除了2),减少了约一半的循环次数,适用于中等大小的数(如n
进一步优化:6k±1 法则
除了2和3,所有素数都可以表示为6k±1的形式。利用这一点可以大幅减少判断次数。
bool isPrime(int n) {
if (n <= 1) return false;
if (n <= 3) return true;
if (n % 2 == 0 || n % 3 == 0) return false;
for (int i = 5; i * i <= n; i += 6) {
if (n % i == 0 || n % (i + 2) == 0)
return false;
}
return true;
}
该方法先排除能被2或3整除的数,然后从5开始,每次检查i和i+2(即6k-1和6k+1),步长为6。在实际测试中比前一种更快。
处理大数:Miller-Rabin 概率算法
当n非常大(如超过1e18)时,确定性算法太慢。Miller-Rabin是一种高效的概率性素数测试算法,适合大数场景。
Procys
AI驱动的发票数据处理
102
查看详情
基本思路是基于费马小定理和二次探测定理,通过多次随机测试来判断是否“极大概率”为素数。
#include <bits/stdc++.h>
using namespace std;
<p>long long modMul(long long a, long long b, long long mod) {
return (__int128)a * b % mod;
}</p><p>long long modPow(long long base, long long exp, long long mod) {
long long result = 1;
while (exp > 0) {
if (exp & 1) resu
lt = modMul(result, base, mod);
base = modMul(base, base, mod);
exp >>= 1;
}
return result;
}</p><p>bool millerRabin(long long n, long long a) {
if (n % a == 0) return false;
long long d = n - 1;
while (d % 2 == 0) {
if (modPow(a, d, n) == n - 1) return true;
d >>= 1;
}
long long temp = modPow(a, d, n);
return temp == 1 || temp == n - 1;
}</p><p>bool isPrime(long long n) {
if (n < 2) return false;
if (n == 2 || n == 3) return true;
if (n % 2 == 0) return false;</p><pre class='brush:php;toolbar:false;'>// 对于 32 位整数,使用这些底数可保证正确性
vector<long long> bases = {2, 7, 61};
for (long long a : bases) {
if (a >= n - 1) break;
if (!millerRabin(n, a)) return false;
}
return true;}
该实现对32位以内的整数完全准确。对于更大的数,可增加测试底数(如2, 325, 9375, 28178, 450775, 9780504, 1795265022)以提高准确性。
基本上就这些。小数用6k±1法足够快,大数考虑Miller-Rabin。关键在于根据数据范围选择合适的方法。
以上就是C++如何判断一个数是素数_C++质数判断的高效算法实现的详细内容,更多请关注其它相关文章!
# 头文件
# 雷州网站建设推广公司
# 石家庄正规seo
# 临县附近哪里有网站推广
# 新品牌怎么做营销推广词
# 医院seo怎么优化
# 烟台seo软件推广价格
# seo概念化图片大全
# 滨海新区网站seo推广哪家专业
# 上饶定制网站建设
# 廊坊市seo
# 是一种
# c++
# 合数
# 前向
# 游戏开发
# 如何实现
# 如何用
# 如何处理
# 如何判断
# 递归
# c++编程
# 质数
# 常见问题
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
TikTok评论显示延迟如何处理 TikTok评论刷新优化方法
QQ邮箱登录官网首页 腾讯QQ邮箱网页入口
J*aScriptWebpack优化_J*aScript构建工具实战
响应式容器内容自动缩放与宽高比维持教程
sublime如何只显示或隐藏特定类型文件_sublime侧边栏文件过滤
win11开机启动修复循环怎么办 Win11无法进入系统高级启动解决方法【修复】
windows10怎么查看硬盘序列号_windows10硬盘id查询命令
在Go Martini框架中高效服务动态生成图像的实践指南
163邮箱官方主页登录 直达网易邮箱登录核心页面
c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解
解决 Express.js 中 PUT 请求密码修改失败的路由配置指南
163邮箱登录密码 163邮箱忘记密码找回
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】
ACG动漫手机版官网入口 手机ACG动漫APP在线观看正版
微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法
Spyder启动失败:字体文件权限拒绝错误解决方案
MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略
TikTok网页版直接登录 TikTok网页端官方平台入口
邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策
Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】
J*aScript对象创建方式_J*aScript设计模式应用
css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版
微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法
苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】
黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】
AO3访问入口汇总 AO3网页版同人作品一键直达
J*a编写用户注册与登录功能_掌握字符串与验证逻辑
曝R星经典之作开发图 设计简陋但信息密集!
千牛数据看板网页版_千牛数据看板网页版访问方法
蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】
抖音网页版平台入口 抖音网页版官网在线访问教程
Go语言中Map值调用指针接收器方法的限制与应对
zookeeper 都有哪些功能?
12306几点到几点不能订票? | 官方最新系统维护时间全解析
漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接
CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题
Mac怎么使用表情符号_Mac Emoji快捷键面板
蛙漫2台版漫画地址 Manwa2正版网页版链接
Archive of Our Own官网直达 AO3最新可用地址一览
快手赚钱渠道_快手收益来源
word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法
age动漫网站入口 age动漫官网直接访问入口
海量存储:机器视觉智能化的核心基石
百度浏览器字体显示异常偏小_百度浏览器字体渲染修复方案
J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明
C++如何比较两个字符串_C++ string compare函数与操作符对比


2025-12-12
浏览次数:次
返回列表
lt = modMul(result, base, mod);
base = modMul(base, base, mod);
exp >>= 1;
}
return result;
}</p><p>bool millerRabin(long long n, long long a) {
if (n % a == 0) return false;
long long d = n - 1;
while (d % 2 == 0) {
if (modPow(a, d, n) == n - 1) return true;
d >>= 1;
}
long long temp = modPow(a, d, n);
return temp == 1 || temp == n - 1;
}</p><p>bool isPrime(long long n) {
if (n < 2) return false;
if (n == 2 || n == 3) return true;
if (n % 2 == 0) return false;</p><pre class='brush:php;toolbar:false;'>// 对于 32 位整数,使用这些底数可保证正确性
vector<long long> bases = {2, 7, 61};
for (long long a : bases) {
if (a >= n - 1) break;
if (!millerRabin(n, a)) return false;
}
return true;