求a的m次方时,若m较大,则效率较低,运用分治法(在本博客中搜索分治法,将了解相关信息)进行快速幂计算
主要思想:
f^n=f^(n/2)*f^(n/2) n为偶数
f^n=f^(n/2)*f^(n/2)*f n为寄数
解释1
m的值是10,用二进制表示就是1010。
m>>1相当于m=m>>1;
m>>1向右移一位,也就是二进制数1010变成了101.
然后再将101也就是5赋值给m。
递归算法:
#include<stdio.h>
double power1(double a,int m){
double f;
if(m==0) return 1;
if(m==1) return a;
else {
f=power1(a,m>>1);//见解释1
f*=f;
if(m&1==1){ //若m为奇数,m与1的二进制按位与
f*=a;
}
return f;
}
}
int main(){
int m,a,c;
scanf("%d%d",&a,&m);
c=power1(a,m);
printf("%d",c);
}
非递归算法:
int powerf2(double a,int m){
int f=1.0;
while(m>0){
if(m&1==1){ //若m为奇数,m与1的二进制按位与
f*=a;
}
a*=a;
m>>=1;
}
return f;
}
int main(){
int m,a,c;
scanf("%d%d",&a,&m);
c=power1(a,m);
printf("%d",c);
}