**
快速幂算法总结
快速幂算法的概念
- 快速幂就是做到让程序快速求幂,减少时间复杂度,使程序更快运行
快速幂的时间复杂度
- 若题目为求a^n的值,那此时程序的时间复杂度为O(n),但如果使用快速幂,便可以将时间复杂度减少到O(log(n))
快速幂算法的代码
int qpow(int a,int b)//首先输入两个值,表示所要运算的a^b
{
int ans=1; //对结果赋初值,防止之后程序运行时出错
while(b) //当b!=0时运行程序
{
if(b&1) //判断此时是否需要相乘
ans=ans*a;
b>>=1; //让b右移一位
a=a*a; //不断更新a的次方数
//每运行一次,a的次方数加 1
}
return ans; //得到结果
}
- 首先输入两个值a,b(a^b),并对ans赋初值为1
- 开始运算,在b!=0的时候,进入循环
- 判断b的二进制数的末尾为0或是1,若为0则不相乘,为1则进行相乘
- b的值不断更新,每次右移一位(除以2)
- a的值不断更新,每更新一次次方数加一次
- 当b=0时,说明对b的分解完成,退出循环
好像有点难以理解 ,再来举个栗子
例如求2的90次方
如果不用快速幂的话,程序需要运行90次,但快速幂只需要四次
首先输入a(2),b(90),开始运算,此时b(90)!=0,进入循环
b&1这里好像需要说明一下
运用了按位与运算符(&)90的二进制数为1011010,当二进制末尾位置上为0时不进行运算,当二进制末尾位置上为1时进行运算(这就是为什么每次循环都要让b右移一位了,因为要二进制的每一位究竟是0还是1)但为什么为0时相乘,为1时不乘呢?
因为快速幂是指将所求的次方数分解
例如90的二进制数为1011010,那就说明90可以由2+8+16+64构成,2的90次方就可以计算为 2^90 = 2^(2 + 8 + 16 + 64) = 2^2 * 2^8 * 2^16 * 2^64
这样计算就可以大大减少循环次数了
来源:CSDN
作者:double快乐kwx
链接:https://blog.csdn.net/innominate/article/details/103244629