当我们要手动实现一个pow(x,n)函数的时候,一般做法是将x迭代n次,每次res*=x,最后res便是答案,可若n的值过长,在竞赛或项目中被卡时间,我们就需要优化这种做法,这种做法就叫做快速幂,或者反复相乘法。
快速幂原理
快速幂的做法很简单,将x的指数换成二进制的形式,如x^108= x^(1101010) 这样结果就等于x^2^1 + x^2^3 + x^2^5 + x^2^6, 像x^2^k很容易被预处理出,且只需要logn次可预处理出全部结果,将O(n)的时间复杂度讲到O(logn).
快速幂的预处理
x^2^0 = x,
x^2^1 = x^2
x^2^2 = x^4......若n是int的范围内只需要32次就可全部预处理。
代码展示
class Solution {
public:
double myPow(double x, int n) {
typedef long long ll;
double res = 1;
bool is_minus = n < 0;
for(ll k = ll(abs(n)); k ; k >>= 1){
if(k & 1) res *= x;
x *= x;
}
if(is_minus) res = 1/ res;
return res;
}
};