剑指offer:数值的整数次方

剑指offer:数值的整数次方

题目:

实现函数 double Power(double base, int exponent),求base的exponent次方。

不使用库函数,不需要考虑大数问题。

思路:

简单的一次次相乘,效率太低,可以采用二分的想法。对于一个exponent,可以分解成 2的幂次相加的形式。这种分解恰好对应了这个exponent的二进制形式。如图:

如exponent 等于10 时。

10  = 1 × 2^3 + 0 × 2^2 + 1 × 2^1 + 0 × 2^0。

而我们知道 base^{2^n} =base^{ 2^{n-1}} ×base^{ 2^{n-1}},所以可以达到O(logn)的时间复杂度。

实现:

牛客网编程通过:

class Solution {
public:
    double Power(double base, int exponent) {
        if (base == 0) return 0;
        if (exponent == 1) return base;
        int exponent_plus = exponent > 0 ? exponent : -exponent;
        int index;
        double temp = base;               //记录base^{2^i}的值
        double value = 1;
        while(exponent_plus)
        {
            index = exponent_plus & 0x1;       //当前位的index:0 或 1
            exponent_plus = exponent_plus >> 1;
            if (index == 1) value = value * temp;
            temp = temp * temp;
        }
        return exponent > 0 ? value : 1 / value;
    }
};

注:exponent & 0x1的其实是exponent % 2的意思, exponent >> 1是 exponent  /= 2的意思。

采用位运算程序的效率会更高一些。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值