剑指offer 面试题16 数值的整数次方

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

输入:double型浮点数base,int型整数exponent。

输出:double型结果。

思路:本题思路不难,但是容易忘记处理各种边界值,异常值。

当exponent为正数时,base直接累乘exponent-1次,得到结果

异常值1:当exponent为负数时

处理方法:先取得exponent的绝对值,然后做累乘,得到中间结果,最后结果为1.0/中间结果。

异常值2:当base为0时,exponent为负数时,容易出现1/0.

处理方法:增加一个判断,抛出异常。

代码:

class Solution {
public:
    double Power_Core(double base, unsigned int exponent)
    {
        double result=base;
        for(unsigned int i=1;i<exponent;++i)
        {
            result=result*base;
        }
        return result;
    }
    double Power(double base, int exponent) {
        double result;
        if(abs(base-0.0)<0.0000001&&exponent<0)
            return 0.0;
        if(exponent==0)
            return 1.0;
        unsigned int absExponent = (unsigned int)(exponent);
        if(exponent<0)
            absExponent = (unsigned int)(-exponent);
        result= Power_Core(base, absExponent);
        if(exponent<0)
        {
            result=1.0/result;
        }
        return result;
    }
};

复杂度分析:时间复杂度为O(exponent),空间复杂度为O(1)。

性能优化:通过优化Power_Core函数,将时间复杂度减小为 O(log exponent),空间复杂度不变。

    double Power_Core(double base, unsigned int exponent)
    {
        if(exponent==1)
            return base;
        double result=Power_Core(base,exponent>>1);
        result *= result;
        if(exponent&0x1==1)
            result*=base;
        return result;
    }
发布了58 篇原创文章 · 获赞 10 · 访问量 7524

猜你喜欢

转载自blog.csdn.net/qq_22148493/article/details/104461066
今日推荐