求a^b,直接b次循环,当b较大时会比较慢,比如,2 ^32当求出2 ^16时,没必要再循环,直接让2 ^16自乘就可得。16推8,8推4,4推2,2推1 。
举例:2的13次方;
13:1101
2的13次方,就是2的1次方 * 2的4次方 * 2的8次方。
1,4,8分别是,13的二进制数的十进制值。
所以,依次判断b的最后位是否为1,是,让ans*a,b再除以2,相当于右移一位,b/2,对应的a就得平方。再判断新的最后一位,以此类推,知道遍历完b的二进制树。
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
while(scanf("%d %d",&a,&b)!=EOF){
int ans = 1;
while(b!=0){//b转换为2进制未结束
if(b&1==1){
ans = ans*a;
}
b = b>>1;
a = a*a; //b除以2,即a的幂少了一半,所以a要平方;a^4 = a^2*a^2
}
printf("%d\n",ans);
}
return 0;
}