50. Pow(x, n)
50. Pow(x, n)
难度:Medium
题目描述:
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000示例 2:
输入: 2.10000, 3
输出: 9.26100示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
解题思路:
方法一:暴力法
直接遍历,略
方法二:递归法
分奇数偶数进行二分查找
class Solution {
public:
double myPow(double x, int n) {
long long N = n;
return N >= 0 ? quickMul1(x, N) : 1.0 / quickMul1(x, -N);
}
double quickMul(double x, long long N){
if (N == 0)
{
return 1.0;
}
double y = quickMul(x, N / 2);
return N % 2 == 0 ? y * y : y * y * x;
}
};
方法三:快速幂
对于给定的N,其二进制位上第i位为1的位数贡献了2^i个结果
所以从低位判断N,如果%2==1,就把当前对应的2^i累乘到结果中
class Solution {
public:
myPow(double x, int n) {
long long N = n;
return N >= 0 ? quickMul1(x, N) : 1.0 / quickMul1(x, -N);
}
double quickMul1(double x, long long N){
double ans = 1.0;
double x_contribute = x; // 一开始的累加值只有x本身
// 对N的二进制位,如果是1,则需要累乘x^2^i
while (N > 0)
{
if (N % 2 == 1) // 如果 N 二进制表示的最低位为 1,那么需要计入贡献
{
ans *= x_contribute;
}
// 判断下一位的二进制位,对应的权重*x_contribute
x_contribute *= x_contribute;
N /= 2;
}
return ans;
}
};