新闻中心

C++如何判断一个数是素数_C++质数判断的高效算法实现

2025-12-12
浏览次数:
返回列表
判断素数的高效方法是检查2到√n间的因子。基础优化:n

c++如何判断一个数是素数_c++质数判断的高效算法实现

判断一个数是否为素数(质数)是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 Procys

AI驱动的发票数据处理

Procys 102 查看详情 Procys

基本思路是基于费马小定理和二次探测定理,通过多次随机测试来判断是否“极大概率”为素数。

#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) result = 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函数与操作符对比 

搜索