题目
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,)。不得使用库函数,同时不需要考虑大数问题。
示例
输入:x = 2.00000, n = 10 输出:1024.00000
输入:x = 2.00000, n = -2 输出:0.25000 解释:2-2 = 1/22 = 1/4 = 0.25
解决办法
使用快速幂的方法,以为时间复杂度计算底数的n次幂。快速幂的方法基于二分的思想实现。使用递归方法计算a的n次方时,如果n是不为0的偶数,则先计算a的n/2次方,然后平方。如果是奇数,那么就先计算a的n-1次方,再乘上a。递归的结束条件是a的0次方为1。可以得到递推方程如下所示:
使用非递归方法计算a的n次方时,需要将指数从十进制形式转化为二进制形式。例如,要求解,就需要将11分解为二进制1011。结果res的初始状态为1,对1011从右往左进行遍历。如果遇到的是1,就需要把x和之前的结果res相乘,如果遇到0,则直接x*x即可。最后遍历完后返回res。
代码实现
class Solution {
public:
double myPow(double x, int n) {
double res = 1.0;
long pow = n;
if(pow < 0){
pow = abs(pow);
x = 1/x;
}
while(pow > 0){
if(pow % 2 == 1){
res = res * x;
}
x = x*x;
pow = pow >> 1;
}
return res;
}
};