剑指offer---数值的整数次方

剑指offer—数值的整数次方

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

博客中代码均在牛客C++11(clang++ 3.9)中通过

这道题实际上是对C库中pow函数的模拟实现,第一眼可能会觉得这道题很简单,但要注意,我们需要考虑指数不是正数的情况
0的0次方一般来说是没有意义的,但在高等数学中它的正向收敛趋近于1,这里姑且就按照1来处理
0的负数次方是非法的,因为负数次方相当于取其绝对值次方的倒数,而0是不可以作为分母的。我们可以通过返回值、全局变量和异常来反馈这种情况,这里使用全局变量
一般情况下我们可能会通过exponent-1次的循环来求解,其实我们可以换一种思路:比如要求16次方,可以先求8次方,求8次方先求4次方……这样我们就可以少做很多次乘法,这里通过递归的方式,每一次将exponent向右移位,而对于exponent是奇数的递归层里需要再乘一次底数base

代码如下:

bool InvalidInput = false;
class Solution {
public:
    double Power(double base, int exponent) {
        if(0.0 == base && exponent<0)
        {
            InvalidInput = true;
            return 0.0;
        }
        
        unsigned int x = (unsigned int)exponent;
        if(exponent<0)
            x = (unsigned int)(-exponent);
        double ret = Power1(base,x);
        if(exponent<0)
            ret = 1.0/ret;
        return ret;
    }
    
private:
    double Power1(double base, int exponent)
    {
        if(0 == exponent)
            return 1;
        if(1 == exponent)
            return base;
        
        double ret = Power1(base,exponent>>1);
        ret *= ret;
        if(1 == (exponent&0x1)) //这里注意按位与运算的优先级比==低,所以加括号
            ret *= base;
        return ret;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值