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