剑指offer数值的整数次方 C++

题目描述

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

思路

  1. 这道题目,指明了指数exponent是一个int型的整数,这里就要考虑指数exponent是正还是负。另外,这种幂运算还有一个特殊的法则,如果指数是0,那么结果为1。这些都要考虑进去。
  2. 如果用一个循环,直接让数相乘exponent次,这种做法通常是不可取的,一般都会运行超时。至少在leetcode中是这样的,而且,这种确实不是合理的做法。
    思路: 采用二分法的思想来实现。
    举例说明:如果要求 x 10 x^{10} x10,那么只需要求出 x 5 x^{5} x5,然后 x 5 ∗ x 5 x^{5}*x^{5} x5x5,依次类推,这样可以优化时间复杂度。采用这种方法,时间复杂度为O(logN)。
    如果exponent是偶数,那么 r e s u l t = x e x p o n e n t / 2 ∗ x e x p o n e t / 2 result=x^{exponent/2}*x^{exponet/2} result=xexponent/2xexponet/2
    如果exponent是奇数,那么 r e s u l t = x e x p o n e n t / 2 ∗ x e x p o n e t / 2 ∗ x result=x^{exponent/2}*x^{exponet/2}*x result=xexponent/2xexponet/2x
    注:
    下面的程序虽然通过了,但是仍然漏考虑了情况。自己没有考虑到,当base为0.0,而exponent为负数的情况。此时 1/base,直接就会导致出问题。这一点是需要考虑的。

解答

class Solution {
public:
    double Power(double base, int exponent) {
        if(exponent==0)
        {
            return 1;
        }
        if(exponent<0)
        {
            return Power(1/base,-1*exponent);
        }
        //注意,下面如果写为
        //return Power(base,exponent/2)*Power(base,exponent/2);
        //那对优化时间没有任何意义
        if(exponent%2==0)
        {
            double temp=Power(base,exponent/2);
            return temp*temp;
        }
        else
        {
            double temp=Power(base,exponent/2);
            return temp*temp*base;
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值