题目:Implement pow(x, n).
思路:
一般来说数值计算的题目可以用两种方法来解,一种是以2为基进行位处理的方法,另一种是用二分法。这道题这两种方法都可以解,下面我们分别介绍。
divide and conquer; 分成四类讨论,m取0,偶数,正奇数,负奇数。
复杂度:把x的n次方划分成两个x的n/2次方相乘,然后递归求解子问题,结束条件是n为0返回1。因为是对n进行二分,迭代次数等于n的位数,算法复杂度也是O(logn)。
AC Code:
class Solution {
public:
double pow(double x, int n) {
//实现幂的运算
//divide and conquer
if(n == 0) return 1;
double tmp = x;
//整数除法会截断到整数
tmp = pow(x, n/2);
//分四类,m取0,偶数,正奇数,负奇数。
if(n % 2 == 0)
{
return tmp * tmp;
}
else
{
if(n > 0)
return x * tmp * tmp;
else
return tmp * tmp / x;
}
}
};