/* This is a simple solution based on divide and conquer */
public class Solution {
public double pow(double x, int m) {
double temp=x;
if(m==0)
return 1;
temp=pow(x,m/2);
if(m%2==0)
return temp*temp;
else
{
if(m > 0)
return x*temp*temp;
else
return (temp*temp)/x;
}
}
/*
按照定义做的O(n)肯定是TLE的。
利用这个信息:x2n = (xn)2
有个注意点,当n为负是,直接取反是不可行的。
由于int的表示范围是[-231, 231-1],当n为INT_MIN时,取反会溢出。
因此需要对n==INT_MIN单独考虑。
另外,除以2可以用右移1位来实现。
思路1:利用整数n的二进制表达
性质:(x^y)^z = x^(y*z)
例如:(5^3)^2 = 5^3 * 5^3 = 5^(3*2)
10: 二进制(1010)b = (2^3)*1 + (2^2)*0 + (2^1)*1 + (2^0)*0
3^10 = 3^[(2^3)*1] * 3^[(2^2)*0] * 3^[(2^1)*1] * 3^[(2^0)*0]
res = 1
res = res^2 * 3^1 = 3^(1)b
res = res^2 * 3^0 = 3^2 = 3^(10)b
res = res^2 * 3^1 = 3^5 = 3^(101)b
res = res^2 * 3^0 = 3^10 = 3^(1010)b
需要特殊处理 n<0的情况。
思路2:分治递归
递归公式为:x^n = x^(n/2) * x^(n/2) * x^(n%2)
*/
//Solution1
class Solution {
public:
double pow(double x, int n) {
bool negPow = n<0 ? true : false;
n = abs(n);
double res = 1;
for(int i=31; i>=0; i--) {
res = res*res;
if(n & (1<<i))
res = res*x;
}
if(negPow) res = 1/res;
return res;
}
};
//Solution2
class Solution {
public:
double pow(double x, int n) {
if(n>=0)
return powPositive(x,n);
else
return 1/powPositive(x,-n);
}
double powPositive(double x, int n) {
if(n==0) return 1; // base case
double res = powPositive(x, n/2);
res *= res;
if(n%2) res *= x;
return res;
}
};
public class Solution {
public double myPow(double x, int n) {
if (n == 0) {
return 1;
}
if (n < 0) {
//n *= -1; 2.00000 ^ (-2147483648) output 0.00000
x = 1 / x;
}
return n % 2 == 0 ? myPow(x * x, Math.abs(n / 2)) : x * myPow(x * x, Math.abs(n / 2));
}
}