不扯那么多,我就直接讲解快速幂是怎么样求解计算的;
首先你要知道快速幂是把指数b转换为二进制进行权值进位来计算a的b次方的;例如2的11次方;11的二进制位1011,就是8+0+2+1;a的8次方乘a的2次方再乘a的1次方;每次都把a的权值进一位也就是这样的最开始a在1位为a,第一次是a进一位为a的2次方,第二次就是a的4次方。。。依次类推。
再给大家讲几个小知识有助于理解下面的代码:
& 与运算
法则 0&0=0;0&1=0;1&0=0;1&1=1 ;
b&1:如果b是个奇数b&1等于1,如果是个偶数b&1为0;
下面就是模板代码给的有注释
/*********
*如果求a的b次方对某个数取余,数据太大的话,
*可以先对a求余,每次计算sum 都对sum进行求余
* 公式的引理,即积的取余等于取余的积的取余。
**********/
#include <stdio.h>
void Pow(int a, int b)
{
long long Sum;
int Base;
Sum = 1;
Base = a;
while(b)
{
if(b&1)
Sum *= Base;
Base *= Base;//每次位权值进一位;
b>>=1; //b向右移一位(也就是b/=2);
}
printf("%lld\n", Sum);
}
int main()
{
int a, b;
long long Sum;
while(~scanf("%d %d", &a, &b))
{
Pow(a,b);
}
return 0;
}
如果有可以改进的地方,可以在评论给我留言,共同学习,谢谢!