文章目录
leetcode50:50. Pow(x, n)
题目描述
实现pow(x, n)
,即计算 x
的n
次幂函数。
Example
输入:2.00000, 10
输出:1024.00000
solution idea
快速幂算法(循环)
-
x
a
+
b
=
x
a
∗
x
b
x^{a+b}=x^a*x^b
xa+b=xa∗xb。可以将
n
看做一系列正整数之和, n = ∑ i b i n = \sum_i b_i n=∑ibi - 使
n
的二进制从最低位(LSB)
到最高位(MSB)
表示为 b 1 , b 2 , . . . , b l e n g t h _ l i m i t b_1, b_2, ..., b_{length\_limit} b1,b2,...,blength_limit - 对于第
i
位为,如果 b i = 1 b_i = 1 bi=1,味着我们需要将结果累乘上 x 2 i x ^ {2 ^ i} x2i - 使用上面提到的公式 ( x n ) 2 = x 2 ∗ n (x ^ n) ^ 2 = x ^ {2 * n} (xn)2=x2∗n
class Solution {
//最小值:Integer.MIN_VALUE= -2147483648 (-2的31次方)
//最大值:Integer.MAX_VALUE= 2147483647 (2的31次方-1)
public:
double myPow(double x, int n) {
long long N = n;
if (N < 0) {
x = 1 / x;
N = -N;
}
double ans = 1;
double current_product = x;
for (long long i = N; i ; i /= 2) {
if ((i % 2) == 1) {
ans = ans * current_product;
}
current_product = current_product * current_product;
}
return ans;
}
};
参考文献
- c++ prime 第5版