## 让计算机很快的计算出a的b次方
------------
暴力相乘的话,计算机要计算b次,而用快速幂,计算机的计算次数达到 log级别
------------
## 原理:
1. 如果将a自乘一次,就会变成a^2,再自乘一次,就是a^4,依次类推..
1. a^x * a^y=a^(x+y),正常的数学运算
1. 将b转化为二进制试试:
比如b=11,转化为二进制就是1011,从左到右,这些1分别代表十进制的8、2、1,那么可以说a^11=a^8 * a^2 * a^1
而在快速幂的过程中,a自乘为a^2,再自乘为a^4,依此类推,达到快速求出的效果
------------
## 过程将会这样
- 假设我们拿到了一个数字a,并且b等于11,但是我们嫌弃乘11次太慢了。
- 那我们稍微转变一下,以计算机的视角来看b的二进制是1011
- 我们定义一个base,让base=a,再定义一个ans=1,用来保存答案,接下来我们在代码中演示
这里的a我们以2为例子
int quickPower(int a, int b)
{
int ans = 1, base = a;
while (b > 0)
{
if (b & 1)
{
ans *= base;
/*
* 第一次循环,b=1011,最后一位为1?,是的话说明 a^11 = a^8 * a^ 2 * a^1,中的 a^1 存在,所以ans*=base
* 第二次循环,b=101,最后一位还是1,那么这个时候说明 a^ 2 存在,继续ans*=base
* 第三次循环,b=10,最后一位不是1,那么这个时候说明 a^4 不存在,那么ans不动
* 第四次循环,b=1,最后一位是1,那么说明 a^8 存在,继续ans*=base,到此循环结束,ans就是最终的结果
*/
}
base *= base;// base 无论如何都进行自乘
b >>= 1;//位运算,b右移一位,如101变成10(把最右边的1移掉了),1011变成101。现在b在二进制下最后一位是刚刚的倒数第二位。结合上面b & 1食用更佳
}
return ans;
}
同时,快速幂通常结合取余运算,如a^b对p取余,代码如下
int quickPower(int a, int b)
{
int ans = 1, base = a;
while (b > 0)
{
if (b & 1)
{
ans *= base;
ans %= p;
}
base *= base;
base %= p;
b >>= 1;
}
ans %= p;
return ans;
}