1. 程式人生 > 實用技巧 >劍指 Offer 16. 數值的整數次方

劍指 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