剑指offer12_数值的整数次方_题解

数值的整数次方

题目描述

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

保证base和exponent不同时为0

示例1

输入

2,3

返回值

8.00000

分析

方案一:快速幂(非递归)

\(a^b\) 来说,如果把 \(b\) 写成二进制,那么 \(b\) 就可以写成若干二次幂之和。例如 \(13\) 的二进制是 \(1101\)\(3\)号位、\(2\)号位、\(0\)号位就都是 \(1\),那么就可以得到 \(13=2^3+2^2+2^0=8+4+1\)

所以 \(a^{13}=a^{8+4+1}=a^8*a^4*a^1\)

任意的 \(a^b\) 可以表示为 \(a^{2k}、...、a^8、a^4、a^2、a^1\) 中若干项的乘积

思考:如果 \(b\) 为负数,如何求 \(a^b\)

比如求 \(x^{-2}\),可以转换为 \((1/x)^2\)

/**
时间复杂度:O(logn)
空间复杂度:O(logn)
**/
class Solution
{
public:
    double Power(double base, int exponent)
    {
        // 如果exponent为负指数
        if (exponent < 0)
        {
            base = 1 / base; //取底数的倒数
            exponent = -exponent;
        }

        double ret = 1.0;
        while (exponent > 0)
        {
            if (exponent & 1) //如果b的二进制末尾为1
            {
                ret = ret * base; //令ans累积上base
            }
            base = base * base; //令a平方
            exponent >>= 1;     //将b的二进制右移1位
        }
        return ret;
    }
};

方案二:递归

①如果 \(b\) 是奇数,那么有 \(a^b=a*a^{b-1}\)

②如果 \(b\) 是偶数,那么有 \(a^b=a^{b/2}*a^{b/2}\)

class Solution
{
public:
    // 递归
    double binary_power(double b, int e)
    {
        if (e == 0)
        {
            return 1;
        }
        if (e & 1)//奇数
        {
            return b * binary_power(b, e - 1);
        }
        else//偶数
        {
            double mul = binary_power(b, e >> 1);
            return mul * mul;
        }
    }
    double Power(double b, int e)
    {
        if (e < 0)
        {
            b = 1 / b;
            e = -e;
        }
        return binary_power(b, e);
    }
};
posted @ 2020-12-10 19:41  RiverCold  阅读(30)  评论(0编辑  收藏  举报