数值的整数次方

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。

输入:x = 2.10000, n = 3
输出:9.26100

思路:快速幂算法

注意当指数是负数时,我们需要先取指数的绝对值,最后将乘积的倒数作为答案。

比如现在我们要计算7的10次方。
将10写成二进制形式,即(1010)2
实际上,对于任意的整数,我们都可以把它拆成若干个7(100)~2~的形式相乘。而这些7(100)2,恰好就是71、72、74……我们只需不断把底数平方就可以算出它们。

  • 1010的最后一位是0,1010 & 1,也就是末位为不为1,所以71这一位不要,然后x = 7 * 7,1010变为101。
  • 101的最后一位是1,所以res = 7 * 7,101变为10,a再自乘,x = 7 * 7 * 7 * 7。
  • 10的最后一位是1,跳过,自乘 x = 7 8
  • 最后res = 72乘上78,得到710
class Solution {
public:
    double myPow(double x, int n) {
        typedef long long ll;
        double res = 1;
        bool if_n = n < 0;
        for(ll k = abs(ll(n)); k; k >>= 1)
        {
            if(k & 1) res *= x;
            x *= x;
        }
        if(if_n) res = 1 / res;
        return res;
    }
};

复杂度分析:

  • 时间复杂度:假设指数n,一共会循环O(logn)次。故时间复杂度O(logn)。
  • 空间复杂度:O(1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值