实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
输入:x = 2.10000, n = 3
输出:9.26100
思路:快速幂算法
注意当指数是负数时,我们需要先取指数的绝对值,最后将乘积的倒数作为答案。
比如现在我们要计算7的10次方。
将10写成二进制形式,即(1010)2
实际上,对于任意的整数,我们都可以把它拆成若干个7(100)~2~的形式相乘。而这些7(100)2,恰好就是71、72、74……我们只需不断把底数平方就可以算出它们。
- 1010的最后一位是0,1010 & 1,也就是末位为不为1,所以71这一位不要,然后x = 7 * 7,1010变为101。
- 101的最后一位是1,所以res = 7 * 7,101变为10,a再自乘,x = 7 * 7 * 7 * 7。
- 10的最后一位是1,跳过,自乘 x = 7 8
- 最后res = 72乘上78,得到710。
class Solution {
public:
double myPow(double x, int n) {
typedef long long ll;
double res = 1;
bool if_n = n < 0;
for(ll k = abs(ll(n)); k; k >>= 1)
{
if(k & 1) res *= x;
x *= x;
}
if(if_n) res = 1 / res;
return res;
}
};
复杂度分析:
- 时间复杂度:假设指数n,一共会循环O(logn)次。故时间复杂度O(logn)。
- 空间复杂度:O(1)