Implement pow(x, n), which calculates x raised to the power 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]
【题意】
求x的n次方,其中n的范围是INT_MIN ~ INT_MAX。
【思路】
快速幂。
假设 n = 2^a1 + 2^a2 + ... + 2^am;
那么 x^n = x^(2^a1 + 2^a2 + ... + 2^am) = x^2^a1 * x^2^a2 * ... * x^2^am。
按照一遍遍地迭代相乘获得幂的时间复杂度是 O(n),通过快速幂则是O(logn)。
这里用到&1和>>1。
因为这里涉及到一个INT_MIN,但是 -1*INT_MIN > INT_MAX的,所以将n转化为了long long,避免溢出。
【代码】
class Solution {
public:
double myPow(double x, int n) {
bool isNeg = false;
long long num = n;
if(num < 0){
num *= -1;
isNeg = true;
}
double ans = 1;
while(num){
if(num & 1)
ans *= x;
x *= x;
num >>= 1;
}
if(isNeg) ans = 1 / ans;
return ans;
}
};