在平时我们需要求一个a^b时,一般会用c++自带的pow()函数对吧,可是加入数据十分大时,pow()是十分慢的,这个时候我们需要一个能高效求出a^b的算法,这这时就出现了快速幂算法。
假如我们需要求3^999,那么我们是不是可以发现3^999 =3 ^ (512 + 256 + 128 + 64 + 32 + 4 + 2 + 1)=(3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^ 2) * 3。我们可以先把999拆开,拆成 (512 + 256 + 128 + 64 + 32 + 4 + 2 + 1),这时会发现他们是2的n次方。就可以使用分治的思想把(3 ^ 512) 、(3 ^ 256) 、 (3 ^ 128) 、 (3 ^ 64) 、(3 ^ 32) 、(3 ^ 4) 、 (3 ^ 2) 、3^1分别求出后再相乘,就有了递归算法。
int recursion(int a,int b){
int tem = 1;
if(b == 0)return 1;
else if(b == 1)return a;
tem = tem*recursion(a,b>>1);
tem = tem*tem;
if(b&1)tem = tem*a;
return tem;
}
将快速幂递归算法改进后就有了递推算法
int loop(int a,int b){
int tem = 1,ret = a;
while(b > 0){
if(b&1)tem = tem*ret;
ret = ret*ret;
b >>= 1;
}
return tem;
}
这就是快速幂算法,当然很多时候我们还会遇到一个(a^b)%c其中a^b非常大,就有了快速幂取模算法。
int quickpow(int a,int b,int k){
int tem = 1,ret = a;
while(b > 0){
if(b&1)tem = (tem*ret)%k;
ret = (ret*ret)%k;
b >>= 1;
}
return tem;
}