class Solution {
public:
double myPow(double x, int n) {
bool down = true; // 负数次方时为倒数
bool sign = true; //
if (n < 0)
down = false;
if (n > INT_MAX || n < INT_MIN )
return 0;
if (n == INT_MIN)
{
sign = false;
n = INT_MAX;
}
if (x == 0 || x == 1 || n == 1)
return x;
int m = abs(n);
if (x == -1)
{
if ( ((m%2 == 0) && sign) || ((m%2 == 1) && !sign) )
return 1;
return -1;
}
if (m == 0)
{
return 1;
}
else
{
while ((m & 1) == 0) // 过滤掉二进制中末尾的0
{
m >>= 1;
x *= x;
}
}
double ret = 1;
while (m != 0)
{
if ((m & 1) != 0)
ret *= x;
x *= x;
m >>= 1;
}
if (!down)
ret = 1 / ret;
if (!sign)
ret *= ret;
return ret;
}
};