Pow(x, n)

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;
    }

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值