将幂的运算转换为二进制的运算,类似于进制转换思想,将二进制转换为十进制。
如次数为10,二进制表示是1010,每次将数右移一位,同时将底数自乘,即每次将底数的次数乘2,只要遇到尾数为1时,将结果乘上底数(这里指自乘后的底数),即可完成幂运算。
long long quick_power(long long base,long long power)
{
long long result=1;
//将power看成二进制形式
while(power)
{
//相当于将二进制转化为十进制一样
//末尾有1就加上相应的数,因为两数相乘指数相加,因此用乘法运算
//每移动一次就将结果乘2
if(power&1)
{
result*=base;
}
power>>=1;
//base表示2^n
base*=base;
}
return result;
}
如果要求结果保留n位,只要每次对底数和结果取模即可。
//对结果取模的运算
long long quick_power(long long base,long long power,long long mod)
{
long long result=1;
base%=mod;
//将power看成二进制形式
while(power)
{
//相当于将二进制转化为十进制一样
//末尾有1就加上相应的数,因为两数相乘指数相加,因此用乘法运算
//每移动一次就将结果乘2
if(power&1)
{
result=(result*base)%mod;
}
power>>=1;
//base表示2^n
base=(base*base)%mod;
}
return result;
}