剑值offer66题之每日一题——第十二题

题目描述:

         给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

思路:1.当底数小于0且指数大于0,出现除0错误要处理

             2.判断double底数是否为0,不能用==

             3.优化求幂运算:n=偶数:b的n次方=b的(n/2)次方 * b的(n/2)次方;n=奇数:b的n次方=b的((n-1)/2)次方* b的((n-  1)/2)次方 * b。

             4.除2运算用左移:e>>1

             5.判断奇数用(e&1)==1

代码实现:

bool equal(double a,double b)
    {
        if(abs(a-b)<0.000001)
             return true;
        else return false;
    }
    double Power(double base, int exponent) {
        if(equal(base,0.0)&&exponent<0)
            return 0.0;
        int absexponent=abs(exponent);
        double result=getpower(base,absexponent);
        if(exponent<0) 
            result=(1.0/result);
        return result;
    
    }
    //优化求幂函数
    double getpower(double b,int e)
    {
        if(e==0) return 1.0;
        if(e==1) return b;
        double result=getpower(b,e>>1);//e左移一位是除以2,求得b的(n/2)次方或者(n-1)/2次方
        result*=result;//b的n次方=b的(n/2)次方 * b的(n/2)次方
                       //或者b的n次方=b的((n-1)/2)次方* b的((n-1)/2)次方 * b
        if((e&1)==1) result*=b; //指数为奇数
        return result;
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值