快速幂运算

#include<bits/stdc++.h>
using namespace std;
int fun(int a,int b){//a的b次方
int ans=1,base=a;
while(b){
if(b&1) ans*=base;
base=base*base;
b>>=1;
}
return ans;
}
int main(){
int a,b;
cin>>a>>b;
cout<<fun(a,b);
return 0;
}

 

int poww(int a,int b){//a代表的是底数,b代表的是指数

int ans=1,base=a;//ans存放结果,base是存放底数直接用a也可以
while(b!=0){
if(b&1!=0)ans*=base;//如果b的二进制位不是0,那么我们的结果是要参与运算的
base*=base; //不断的加倍
b>>=1; //二进制的移位操作,相当于每次除以2,用二进制看,就是我们不断的遍历b的二进制位
  }
return ans;
}

 

 & 和 >> ,&运算通常用于二进制取位操作,例如一个数 & 1 的结果就是取二进制的最末位。还可以判断奇偶x&1==0为偶,x&1==1为奇。>>运算比较单纯,二进制去掉最后一位

 

先看看怎么求a的a次方更快:

 

你看,只有指数对应的位为1,才相乘
而且每个乘的数都有规律,
假设a^2^0=c,a^2^1=c*c=c1,
a^2^2=c1*c1
那就用一个数存c,然后循环乘就行,
至于什么时候算在最终结果之内,只要看指数对应的位是否为一

posted @ 2022-05-06 21:09  jwb_9  阅读(57)  评论(0)    收藏  举报