题目:Implement pow(x, n).
解析1:使用递归法,因为 xn=(x2)n/2∗xn%2 ,代码如下:
// 递归法,时间复杂度 O(logn)
// 注意:-5 / 2 = -2, -5 % 2 = -1;
class Solution {
public:
double myPow(double x, int n) {
if (n < 0) return myPow_aux(1.0 / x, -n);
// 事实上,n 是正数还是负数无关紧要;
// n 的作用只是判断要迭代多少次;
// 在这种情况下正数和对应的负数都能判断出相同的迭代次数;
// 再者如果 n = INT_MIN, -n 也为 INT_MIN;
// 所以从最终结果角度讲,没要必要把 n 写成 -n
// 但为了便于理解,还是把 n 写成 -n。
return myPow_aux(x, n);
}
private:
double myPow_aux(double x, int n)
if (n == 0) return 1;
else if (n % 2 != 0) return myPow(x * x, n / 2) * x;
else return myPow(x * x, n / 2);
}
};
解析2:迭代法,把幂指数 n 用二进制表示。代码如下:
// 迭代法,时间复杂度 O(logn)
class Solution {
public:
double myPow(double x, int n) {
if (n < 0) return myPow(1.0 / x, -n)
// 事实上,n 是正数还是负数无关紧要;
// n 的作用只是判断要迭代多少次;
// 在这种情况下正数和对应的负数都能判断出相同的迭代次数;
// 再者如果 n = INT_MIN, -n 也为 INT_MIN;
// 所以从最终结果角度讲,没要必要把 n 写成 -n
// 但为了便于理解,还是把 n 写成 -n。
double result = 1;
for (int i = 0; n; ++i) {
if (i != 0) x = x * x;
if (n % 2 != 0) result *= x;
n /= 2;
}
return result;
}
};