Implement pow(x, n), which calculates x raised to the power n (xn).
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
Example 1:
Input: 2.00000, 10
Output: 1024.00000
Example 2:
Input: 2.10000, 3
Output: 9.26100
Example 3:
Input: 2.00000, -2
Output: 0.25000
Explanation: 2-2 = 1/22 = 1/4 = 0.25
Note:
-100.0 < x < 100.0
n is a 32-bit signed integer, within the range [−231, 231 − 1]
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
快速幂算法
举个例子 计算 x77时利用递归的思想
按照这样的顺序来计算:
x —> x2 —> x4—> x9 —> x19 —> x38 —> x77
直接从左到右进行推导看上去很困难,因为在每一步中,我们不知道在将上一次的结果平方之后,还需不需要额外乘 x。但如果我们从右往左看,分治的思想就十分明显了:
- 当我们要计算 xn时,我们可以先递归地计算出 y = xn/2 (其中n/2向下取整)
- 根据递归计算的结果,如果 n 为偶数,那么 xn = y2 ,如果 n 为奇数,那么 xn = y2 * x
- 递归的边界为 n = 0,任意数的 0 次方均为 1
- 由于每次递归都会使得指数减少一半,因此递归的层数为 O(logn),算法可以在很快的时间内得到结果。
C++( O(logn) )
class Solution {
public:
double myPow(double x, int n) {
long long N = n;//避免溢出
return N >= 0 ? quickmul(x, N) : 1.0 / quickmul(x, -N);
}
double quickmul(double x, long long n){
if(n == 0){
return 1;
}
double y = quickmul(x , n/2);
return n%2 == 0 ? y * y : y * y * x;
}
};