最朴素的求幂方法
也就是平常使用pow函数,最简单的实现就是一直累乘,可以得到这样的代码:
int Pow(int a,int b){
int ans = 1;
for(int i = 0;i < b;i++){
ans *= a;
}
return ans;
}
可以看到,算法的时间复杂度是O(n)。为了降低时间复杂度,我们可以使用快速幂算法,将时间复杂度降低到O(logn),n是幂。
快速幂:
首先,快速幂的目的就是做到快速求幂,假设我们要求a^b,
假设我们要求a^b, 那么其实b是可以拆成二进制的,该二进制数第i位的权为2^(i-1),例如当b==11时 ,a^11 =a(2^0 + 2^1 +2^3)。
11的二进制是1011,11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,
将a¹¹转化为我们将a¹¹转化为算 a1*a2*a8看出来快的多了吧。原来算11次,现在算三次。那么怎么算呢
可以考虑成根据二进制的权值来求解的。那么在关于位运算的部分,我们可以逐位获取b的位,碰到0,就累乘,
碰到1,就将累乘的值并且将乘到答案。由此可以得到代码:
代码如下:
int poww(int a, int b) {
int ans = 1, base = a;
while (b != 0) {
if (b & 1 != 0)
{
ans *= base;
}
base *= base;
b >>= 1;
}
return ans;
}