Implement pow(x, n).
解:
题目要求无比简单
但其实有很多边界条件需要考虑。。
而且对于一些特殊情况如果不优化的话分分钟超时。。
class Solution {
public:
double myPow(double x, int n) {
if(n==0)return 1;
bool flag=false;//指数n是否为负数
if(n<0){flag=true;n=-n;}
if(x==1)return x;
if(x==-1)return abs(n)&1?-1:1;//x为-1的时候看指数n是否是偶数
bool overflow=(abs(x)>1);//是否会发生overflow还是underflow
int pow=1;
double res=x;
if(n==1)return flag?1./x:x;//递归的截止条件
while(pow*2<n)
{
if(overflow) {
if(abs(res)>numeric_limits<double>::max()/abs(res))return numeric_limits<double>::infinity();
}
else
{
if(abs(res)<numeric_limits<double>::min()/abs(res))return 0;
}
res*=res;
pow*=2;
}
double final=res*myPow(x,n-pow);
return flag?1.0/final:final;
}
};