0

0

C++怎么实现快速幂算法_C++数论优化教程【高效】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-25 09:59:03

|

735人浏览过

|

来源于php中文网

原创

快速幂通过二进制拆分将时间复杂度降至o(log n),核心是用n&1和n>>=1处理位运算,每步乘法前必须取模防溢出,禁用std::pow,推荐迭代实现。

c++怎么实现快速幂算法_c++数论优化教程【高效】

快速幂的核心是二进制拆分,不是循环累乘

直接写 for 循环乘 n 次,时间复杂度是 O(n),遇到 n 上亿就卡死。快速幂真正快的地方,在于把指数按二进制位展开——比如求 a^13,13 的二进制是 1101,相当于 a^8 * a^4 * a^1,只用做 3 次乘法 + 3 次平方,总共约 O(log n) 次运算。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 别手写位运算模拟,用 n & 1 判断当前位是否为 1,用 n >>= 1 右移,比除法更安全、更符合底层逻辑
  • 底数每次自乘前,必须对模数取余(如果题目要求取模),否则 a 很快溢出 long long
  • 初始结果设为 1,不是 a;指数为 0 时要能自然返回 1

带模的快速幂必须每步取余,且注意数据类型溢出

常见错误是只在最后取模:result = (result * base) % mod 写成 result = result * base % mod 看似一样,但乘法中间结果可能远超 long long 范围(比如 mod 是 1e9+7,base 是 1e9,两数相乘就到 1e18,刚好卡在 long long 上限边缘;再大一点就溢出变负数)。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • long long 存所有中间变量,int 不够用
  • 乘法前加一层防溢出:如果模数较大(>1e9),考虑用 __int128(GCC 支持)或手动拆乘(不推荐除非必要)
  • 模数为 1 时直接返回 0(任何数 mod 1 都是 0),避免后续计算无意义

std::pow 不能替代快速幂,类型和精度都不对

std::pow(double, int) 返回 double,不仅精度丢失(整数超过 2^53 就无法精确表示),而且不支持取模,更无法处理大整数。有人试过 (long long)std::pow(a, n) % mod,结果在 a=10, n=18 就开始出错。

PatentPal专利申请写作
PatentPal专利申请写作

AI软件来为专利申请自动生成内容

下载

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 彻底放弃 std::pow 做整数幂运算,它不是为你设计的
  • 如果只是求小指数(n ≤ 60)且不取模,用普通循环反而更清晰、无风险
  • 模板化实现时,把模数作为非类型模板参数传入(如 template<long long mod></long>),编译期确定,避免运行时传参开销

递归写法简洁但容易栈溢出,迭代更稳妥

递归版本看着短:return n == 0 ? 1 : (n & 1 ? a * pow(a*a % mod, n/2) : pow(a*a % mod, n/2)) % mod,但深度是 log₂(n),当 n 接近 2^60 时递归深度约 60 层,看似不多,但在嵌套调用多或栈空间受限环境(如 OJ 默认栈小)下可能 Segmentation fault

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 一律用迭代,代码不长,逻辑更可控
  • 注意右移用 n >>= 1,不是 n /= 2;前者对负数行为明确(实际中 n ≥ 0,但养成习惯)
  • 若需支持负指数(如求逆元),先单独判断,再用费马小定理转换,不要硬塞进同一函数

最易被忽略的是:指数为 0 时返回 1,这个边界在取模场景下仍成立(只要模数 ≠ 1);还有就是乘法中间值哪怕只多一次没取余,整个结果就全错——它不会报错,只会静默错误。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

智谱清言 - 免费全能的AI助手
智谱清言 - 免费全能的AI助手

智谱清言 - 免费全能的AI助手

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

311

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

223

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

97

2026.02.12

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

584

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

18

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.1万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 19.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号