原理:
把b转换成2进制数
该2进制数第i位的权为a^(2^(i-1))
例如
a^11=a^(2^0+2^1+2^3)
11的二进制是1 0 1 1
11 = 2^3*1 + 2^2*0 + 2^1*1 + 2^0*1
因此,我们将a^11转化为算a^(2^0)*a^(2^1)*a^(2^3)
#include <stdio.h>
#include <math.h>
long fun1 (long a,long b){ //常规求幂
int r=1;
while (b--)
r *= a;
return r;
}
int fun (int a, int b, int p)
{
int res=1, base=a%p;
while (b)
{
if (b&1)
res *= base % p;
base *= base % p;
b >>= 1;
}
return res;
}
long fun3 (long a,long b){ //快速求幂 位运算
int r=1,base=a;
while (b){
if (b & 1)
r *= base;
base *= base;
b >>= 1;
}
return r;
}
long fun4 (long a,long b){ //快速求幂、更高效的位运算方法
int ans=0;
if (b==0) return 1;
else{
while ((b & 1)==0){
b >>= 1;
a *= a;
}
}
ans = a;
b >>= 1;
while (b){
a *= a;
if (b & 1)
ans *= a;
b >>= 1;
}
return ans;
}
int main (){
int a,b;
while (scanf ("%d%d",&a,&b)==2){
printf ("%ld\n",fun1 (a,b));
printf ("%ld\n",fun3 (a,b));
printf ("%ld\n",fun4 (a,b));
}
}