数值的整数次方

1 题目描述

题目链接

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

 保证base和exponent不同时为0

 示例1
在这里插入图片描述

2 解题思路

预处理:求 pow(b , n), 如果n为负数怎么解决?

例如求 x − 2 x^{-2} x2 是不是可以转换成 ( 1 x ) 2 (\frac 1x)^2 (x1)2

于是,预处理代码如下:

double Power(double b, int n) {
    if (n < 0) {
        b = 1 / b;
        n = -n;
     }
}

2.1 暴力解题

循环n次,n个b相乘

class Solution {
public:
    double Power(double b, int n) {
        if (n < 0) {
            b = 1 / b;
            n = -n;
        }
        double ret = 1.0;
        for (int i=0; i<n; ++i) ret *= b;
        return ret;
    }
};

时间复杂度:O(n)
空间复杂度:O(1)

2.2 递归法(快速幂)

假设我们求 x 8 x^8 x8,如果知道 x 4 x^4 x4,那么 x 8 = ( x 4 ) 2 x^8 = (x^4)^2 x8=(x4)2,所以 x n = ( x n 2 ) 2 x^n = (x^{\frac n2})^2 xn=(x2n)2

但是还有一个问题 如果n是偶数,上述公式即可

如果n是奇数, x n = ( x n 2 ) 2 ∗ x x^n = (x^{\frac n2})^2*x xn=(x2n)2x,例如 x 7 = ( x 3 ) 2 ∗ x x^7 = (x^3)^2*x x7=(x3)2x

代码如下:

class Solution {
public:
    double q_power(double b, int n) {
        if (n == 0) return 1.0;
        double ret = q_power(b, n/2);
        if (n&1) { // 奇数
            return ret * ret * b;
        }
        else {
            return ret * ret;
        }
    }
    double Power(double b, int n) {
        if (n < 0) {
            b = 1 / b;
            n = -n;
        }
        return q_power(b, n);
    }
};

时间复杂度:O(logn),每次规模减少一半
空间复杂度:O(logn),递归栈,以为要记住logn个变量

2.3 非递归的快速幂

假设求 x 6 x^6 x6,已知6可以表示成二进制110

可以表示成 6 = 0 ∗ 2 0 + 1 ∗ 2 1 + 1 ∗ 2 2 6=0*2^0 + 1*2^1 + 1*2^2 6=020+121+122,所以 x 6 x^6 x6可以表示成 x 6 = x 0 ∗ 2 0 + 1 ∗ 2 1 + 1 ∗ 2 2 = x 0 × x 1 ∗ 2 1 × x 1 ∗ 2 2 x^6 = x^{0*2^0 + 1*2^1 + 1*2^2} = x^0 × x^{1*2^1} × x^{1*2^2} x6=x020+121+122=x0×x121×x122 所以,对于二进制数,遇到位数是1的就乘到答案中。

代码如下:

class Solution {
public:

    double Power(double b, int n) {
        if (n < 0) {
            b = 1 / b;
            n = -n;
        }
        double x = b; // 记录x^0, x^1, x^2 ...
        double ret = 1.0;
        while (n) {
            if (n&1) {
                ret *= x; // 二进制位数是1的,乘进答案。
            }
            x *= x;
            n >>= 1;
        }
        return ret;
    }
};

上述方法相对于遍历n的二进制位,是1就乘进结果
时间复杂度:O(logn),因为n的二进制位个数位logn
空间复杂度:O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值