实现 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] 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
再求x的n次幂是,快速的做法不知for循环迭代n次,我们利用二分的思想。
使得每次的结果离最终结果迭代一半,这样就可以在log2n的时间复杂度得带结果。
从前往后想不太好理解,我们倒推,每次计算x 的⌊n/2⌋幂,递归终止条件为当n等于0时,结果唯一。
x的n次幂,就相当于x分之一的-n次幂.
class Solution
{
public:
double myPow(double x, int n)
{
long long N = n;
return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(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次幂,将n展开成二进制各位相乘的形式,n的二进制有多少位几次就能求出结果。
class Solution
{
public:
double myPow(double x, int n)
{
if(x == 1 || n == 0) return 1;
double ans = 1;
long long num = n;
if(n < 0)
{
num = -num;
x = 1/x;
}
while(num)
{
if(num & 1) ans *= x;
x *= x;
num >>= 1;
}
return ans;
}
};