本文已参与「新人创作礼」活动,一起开启掘金创作之路。
非递归版本(时间复杂度:logn)
C中的math头文件pow的参数是double类型 该快速幂是long long类型 double的二进制表示不一样 例题 洛谷P1226 原理:位运算 假设计算a^11 11的二进制表示是 1011 (即8+2+1) 则a^11 = a^(8+2+1) = a^8 a^2 a^1
long long fastpow1(long long a,int n)//非递归版本
{
long long ans = 1;
while(n)
{
if(n&1) //按位与 1&1=1 0&1=0
{
ans = ans*a;//这样写取模直接加在后面即可
}
a = a*a;//这样写取模直接加在后面即可
n>>=1; //二进制右移一位
}
return ans;
}
递归版本
long long fastpow2(long long a,int n) //递归版本
{
if(n==1)
{
return a;
}
long long tmp = fastpow2(a,n/2);
if(n%2==1) //判断次数是奇数还是偶数
{
return tmp*tmp*a; //将a^n分成a^(n/2)*a^(n/2)*a
}
else
{
return tmp*tmp; //将a^n分成a^(n/2)*a^(n/2)
}
}