问题
思路
这个题目比我在牛客刷的要更好。
主要是多了一种情形是对于,INT_MIN的考虑。
如果把它转化为整数次方是0。
因为他的二进制形式是:[10000000000000000000000000000000]
所以,要增加对它的处理。
代码
class Solution {
public:
double myPow(double x, int n) {
if( equal(x, 0.0) ){
if(n>0) return 0.0;
else if(!n) return 1.0;
else return -1.0;
}
else{
if(!n) return 1.0;
else if(1==n) return x;
else{
double res = 0.0;
if(n>0){
double half = myPow(x, n/2);
res = half * half;
if(n%2) res *= x;
}
else{
unsigned int e = 0;
if(n == INT_MIN){
e = (unsigned)(INT_MAX) + 1;
}
else
e = -n;
double half = myPow(x, e/2);
res = half*half;
if(e%2) res *= x;
res = 1.0/res;
}
return res;
}
}
}
private:
bool equal(double a, double b){
const static double eps = 1e-8;
return fabs(a-b) < eps;
}
};
思路1
代码1
class Solution {
public:
double myPow(double x, int n) {
if( is_zero(x) ){
return (!n)?1.0:0.0;
}
else{
if(!n) return 1.0;
int b = abs(n);
double res = 1;
double w = x;
while(b){
if(b%2) res *= w;
b/=2;
w *= w;
}
return (n>0)?res:1.0/res;
}
}
private:
bool is_zero(double val){
const static double eps = 1e-8;
return fabs( val - 0.0 ) < eps;
}
};