class Solution {
public:
double myPowPositive(double x, int n)
{
if(n == 0)
return 1;
if(n %2 == 0)
{
double t = myPowPositive(x, n/2);
return t * t;
}
else
{
double t = x;
return t* myPowPositive(x, n-1);
}
}
double myPow(double x, int n) {
if(n == 0 || x == 1)
return 1.0;
if(x == -1)
{
if(n %2 == 0)
return 1;
return -1;
}
bool flag = false;
if(n < 0)
{
flag = true;
n = -1*n;
}
double t = myPowPositive(x, n);
if(flag)
return 1.0/t;
return t;
}
};
考虑异常的做法:
class Solution {
public:
bool bIsNotValid = false;
double myPowPositive(double x, int n) {
if(n == 0)
return 1;
if(n == 1)
return x;
double result = myPow(x, n>>1);
result *= result;
if(n&1== 1)//奇数
result*=x;
return result;
}
bool equal(double x, double y)
{
if(fabs(x - y) <= 0.00000001)
return true;
return false;
}
double myPow(double x, int n) {
bIsNotValid = false;
if(equal(x, 0) && n < 0)//注意不能直接采用x==0,因为有浮点误差。
{
bIsNotValid = true;
return 0.0;
}
bool flag = true;//标记正负
if(n < 0)
{
n*=(-1);
flag = false;
}
double result = myPowPositive(x, n);
if(!flag)
{
return 1.0/result;
}
return result;
}
};