算法介绍:
在写代码的时候,我们经常会遇到幂运算,在实现的时候我们往往是这样写的:
int pow(int a,int b)
{
int ans=1;
while(b--)
{
ans*= a;
}
return ans;
}
从时间复杂度上分析这个算法的复杂度是O(n)级别,当数量很大时,就会TLE
快速幂即为快速求出一个数的幂,这样可以避免TLE(超时)的错误。其时间复杂度为 O(log₂N),与普通的O(N)相比效率有了极大的提高。
核心思想:
假设我们要求a^n,n为正整数(对于负整数次幂,先求正整数次幂再取倒数就行)。我们以n = 13为例,将n表示为2二进制:
那么:
可见,我们只要观察 n 的每一位,如果第 i 位为1,就乘上
(这个值可以在循环中得到)。
代码实现:
int quickPower(int x,int y)
{
int b=x,ans=1;
while(y!=0)
{
int a=y%2;
if(a==1) ans*=b;
if(a==0) ans*=1;
b=b*b;
y=y/2;
}
return ans;
}
int quickPower(int a, int b)
{
int ans=1,base=a;
while(b>0)
{
if(b&1) ans*=base; //如果b的二进制表示下是1
base*=base; //把base变为a的2次方的(n+1)次方
b>>=1; //删掉二进制b的最后一位数
}
return ans;
}