劍指 Offer 16. 數值的整數次方
阿新 • • 發佈:2020-08-02
劍指 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