/*直接模仿数学中的乘幂算法。*/
class Solution {
public:
double myPow(double x, int n) {
if(n == 0) return 1.0;
else if(fabs(x) < 1e-10) return 0.0;
else{
if(n > 0){
if(x > 0.0) return myPowPositive(x, n);
else{
if((n & 1) == 0) return myPowPositive(-x, n);//n为偶数
else return -myPowPositive(-x, n);//n为奇数
}
}
else{
if(x > 0.0) return 1.0 / myPowPositive(x, -n);
else{
if((n & 1) == 0) return 1.0 / myPowPositive(-x, -n);
else return -1.0 / myPowPositive(-x, -n);
}
}
}
}
double myPowPositive(double x, int n){
double res(1.0);
double eps = 1e-10;
for(int i = 0; i < n; ++i){
if(fabs(res * x - res) < eps) return res;
res *= x;
}
return res;
}
};
/*采用二分法加速。*/
class Solution {
public:
double myPow(double x, int n) {
if(n < 0) return 1.0 / myPow_sub(x, -n);
else return myPow_sub(x, n);
}
double myPow_sub(double x, int n){
if(n == 0) return 1.0;
double tmp = myPow_sub(x, n/2);
if((n & 1) == 0) return tmp * tmp;
else return tmp * tmp * x;
}
};