【剑指Offer-16】数值的整数次方

问题

实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

示例

输入: 2.10000, 3
输出: 9.26100

输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25

解答1:递归

class Solution {
public:
    double myPow(double x, int n) {
        if (x == 0) return 0;
        double res = 1;
        long b = n; // 防止-2147483648取负号后溢出
        if (b < 0) {
            b = -b;
            x = 1 / x;
        }
        while (b > 0) {
            if (b & 1) res *= x;
            x *= x;
            b >>= 1;
        }
        return res;
    }
};

重点思路

快速幂代码模版可见:【C++】快速幂运算

利用十进制数字n的二进制表示,可对快速幂进行数学化解释。根据下图能很容易看出本题解的思路。注意对-2147483648这一输入的特殊处理。

解答2:迭代

class Solution {
public:
    double myPow(double x, int n) {
        if (x == 0) return 0;
        double res = 1;
        long b = n; // 防止-2147483648取负号后溢出
        if (b < 0) {
            b = -b;
            x = 1 / x;
        }
        return mp(x, b);
    }
private:
    double mp(double x, int n) {
        if (n == 0) return 1;
        double res = mp(x * x, n / 2);
        if (n & 1) res *= x;
        return res;
    }
};
posted @ 2021-02-17 10:44  tmpUser  阅读(33)  评论(0编辑  收藏  举报