简单易懂的快速幂取模算法
本文是上一篇文章《程序员必学:快速幂算法》的续集,上一篇文章详细地介绍了快速幂算法,提供了递归、非递归的2种实现方案
抛出问题
请设计一个算法求x的y次幂模z的结果:(x ^ y) % z
- x、y、z都是整数
- z ≠ 0, y ≥ 0
- x、y的绝对值可能很大,比如(1234 ^ 4567) % 30
思考
由于x、y的绝对值可能很大,x ^ y的结果可能会溢出。所以先求x ^ y,再对z取模,显然是不现实的。
这里要借助模运算的一条运算规则
(a * b) % p = ((a % p) * (b % p)) % p


根据上面的推导,就可以很容易写出代码实现
递归实现
int powMod(int x, int y, int z) { if (y == 0) return 1 % z; int half = powMod(x, y >> 1, z); half = (half * half) % z; if ((y & 1) == 0) { // y是偶数 return half; } else { // y是奇数 return (half * (x % z)) % z; } }
非递归实现
int powMod(int x, int y, int z) { int result = 1 % z; x %= z; while (y != 0) { if ((y & 1) == 1) { result = (result * x) % z; } x = (x * x) % z; y >>= 1; } return result; }
测试用例
// 4 powMod(1234, 4567, 30); // 699 powMod(123, 456, 789);
如果你特别希望我写点什么方面的内容,也可以留言建议,谢谢。欢迎关注

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
2013-04-15 Core Animation2-CABasicAnimation
2013-04-15 Core Animation1-简介