题目难度:中等
考察内容:快速幂,递推
题目内容:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0。不得使用库函数,同时不需要考虑大数问题,也不用考虑小数点后面0的位数。
题目分析
首先有负数次幂,可以进行转化,a^(-b)=1/a^b
所以只用考虑a^b即可,很明显可以递推
算法1(递推)
思路很简单,在代码中体现

class Solution {
public:
    double Power(double base, int exponent) {
        double ans=1;//记录答案
        int k=0;//如果exponent<0 记录答案应该为1/ans
        if(exponent<0)exponent=-exponent,k=1;
        //小于0,将b变为正数,记录k=1
        while(exponent--)
        {
            ans=ans*base;
            //计算答案
        }
        if(k==1)return 1.0/ans;
        return ans;
    }
};

复杂度分析:时间复杂度O(n),空间复杂度O(1)
算法2(快速幂)
对于一个数可以用二进制表示,int范围内有32位,可以利用二进制进行优化,比如我们要求2^8,我们通过当为偶数的时候,a^n=(aa)^(n/2),当n为奇数时,a^n=a(aa)^(n/2)的形式,可以转化为4^4->8^2->64^1,就可以了,2^5的话24^2->2*16^1。
图片说明
通过上面的思路,代码很容易实现了

class Solution {
public:
    double Power(double base, int exponent) {
        int f=0;
        if(exponent<0)f=1,exponent=-exponent;
        double ans=1;
        while(exponent)
        {
            if(exponent&1)ans*=base;
            base*=base;
            exponent>>=1;
        }
        if(f)ans=1/ans;
        return ans;
    }
};

复杂度分析:时间复杂度O(logn),空间复杂度O(1)