**
快速幂算法总结
快速幂算法的概念
- 快速幂就是做到让程序快速求幂,减少时间复杂度,使程序更快运行
快速幂的时间复杂度
- 若题目为求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的100次方
如果不用快速幂的话,程序循环与相乘都需要运行100次,但快速幂只需要循环七次,相乘三次
首先输入a(2),b(100),开始运算,此时b(100)!=0,进入循环
b&1这里好像需要说明一下
运用了按位与运算符(&)100的二进制数为1100100,当二进制末尾位置上为0时不进行运算,当二进制末尾位置上为1时进行运算(这就是为什么每次循环都要让b右移一位了,因为要二进制的每一位究竟是0还是1)
但为什么为0时相乘,为1时不乘呢?
因为快速幂是指将所求的次方数分解
例如100的二进制数为1100100,那就说明100可以由4+32+64构成,2的100次方就可以计算为 2100 = 2(4+32+64) = 24 *232 * 264
这样计算就可以大大减少循环与相乘运算的次数了