剑指 Offer 16. 数值的整数次方

剑指 Offer 16. 数值的整数次方

难度⭐⭐

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

快速幂法

\[n = 1b_1 + 2b_2 + 4b_3 + ... + 2^{m-1}b_m\\ x^n=x^{1b_1+2b_2+4b_3+...+2^{m−1}b_m} = x^{1b_1}x^{2b_2}x^{4b_3}...x^{2^{m−1}b_m} \]

Java 代码中 int32 变量 范围 [-2147483648, 2147483647] ,因此当 n = -2147483648时,执行 n = -n 会因越界而赋值出错。解决方法是先将 n 存入 long 变量 b ,后面用 b 操作即可。

class Solution {
    public double myPow(double x, int n) {
        //先判断 n 是否负数
        if(x == 0) return 0;
        long b = n;
        if (b < 0){
            x = 1/x;
            b = -b;
        }
        double ans = 1;
        while(b > 0){
            if((b&1) == 1) ans*=x;
            x *= x;
            b >>= 1;
        }
        return ans;
    }
}
class Solution(object):
    def myPow(self, x, n):
        """
        :type x: float
        :type n: int
        :rtype: float
        """
        if x == 0: return 0
        if n < 0:
            x = 1/x
            n = -n
        ans = 1
        while n > 0:
            if (n&1) == 1:
                ans *= x
            x *= x
            n >>= 1
        return ans
posted @ 2020-08-02 15:38  鱼与鱼  阅读(117)  评论(0编辑  收藏  举报