快速幂
介绍
快速幂是一种计算底数的n次幂的方法,他将朴素的O(n)的时间复杂度缩短到O(logn),计算效率大大提升,减少循环次数,不至于做题超时.
算法核心
他将普通的累乘合并,利用二进制的特性将指数分半,底数平方,循环次数减少.
如:2^5
其指数5为十进制数,二进制为0101,将二进制写为十进制的计算方法是1 * 2^2 +1 * 2^0.
上面的计算就可以看成是0100 + 0001的结果,即1 * 2^2 +1 * 2^0.
依据上面分布相加特性我们是不是可以想到 底数a 每次乘以他本身,当二进制指数第一位遇到1时,便将a的值乘到定义的cnt
变量当中,之后再去掉那一位(去掉的那一位已经被a自乘了),然后继续a自乘,二进制指数继续去掉最后一位,直至第一位再次出现1就再将a的值乘入cnt
当中,最后指数削到最后为0时,就退出并输出cnt
的值.
那么if
判断条件怎么写呢?
这里就要用到&(我下面有讲) 这个位运算符了,通过指数&1,来对二进制指数的第一位进行判断是否为1.
理论结束,下面就是代码实现了.
代码
#include <stdio.h>
int fast_pow(int a, int b) {//自定义函数
int cnt = 1;//创建cnt来乘入a的值
while (b) {
if (b & 1)//判断二进制指数的第一位是否为1
cnt = cnt * a;
a = a * a;
b >>= 1;//这里是位运算,同(/2)的作用相同
}
return cnt;
}
int main() {
int a, b;
scanf("%d %d", &a, &b);
printf("%d", fast_pow(a, b));
return 0;
}
代码很简单是吧ψ(`∇´)ψ
位操作符&
按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现.
例如:
5的二进制0101与3的二进制0011按位与,结果是0001,只有当相对应的位都为1时结果为1,否则为0,也就是与门.
扩展
快速幂常用于取模,如:
洛谷P1226
取模只要带入这个引理:积的取余等于取余的积的取余 就行,不过要注意更改数据类型.
知道了快速幂,你也可以想一下快速乘要如何实现呢?
这是本人的第一篇博客,希望在这里同大家一起进步,我很欢迎,也很感激大家能够来看我的小博客,希望我们共同在二进制海洋中畅游ψ(`∇´)ψ!感受编程带来的快感(。ò ∀ ó。)
随后我也会一直更新的,哪怕没人看ಥ_ಥ,希望以后我也能写出一些高质量文章让大家阅读!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】