题目:Pow(x, n)
- 题号:50
- 难度:中等
- https://leetcode-cn.com/problems/powx-n/
实现 pow(x, n)
,即计算 x 的 n 次幂函数。
示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3
输出:9.26100
示例 3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2^{-2} = 1/2^{2} = 1/4 = 0.25
示例 4:
输入: 1.00000, -2147483648
输出: 1.00000
说明:
- -100.0 < x < 100.0
- − 2 31 < = n < = 2 31 − 1 -2^{31} <= n <= 2^{31}-1 −231<=n<=231−1
- − 1 0 4 < = x n < = 1 0 4 -10^4 <= x^n <= 10^4 −104<=xn<=104
实现
第一种 利用暴力的方法
- 执行结果:超出时间限制
public class Solution
{
public double MyPow(double x, int n)
{
int neg = n < 0 ? -1 : 1;
n = Math.Abs(n);
double result = 1.0d;
for (int i = 0; i < n; i++)
{
result *= x;
}
return neg != -1 ? result : 1.0 / result;
}
}
第二种 利用位运算的方法
思路:利用快速幂法。
假设我们要求a^b
,那么b
可以拆成二进制表示,例如当b = 5
时,5的二进制是0101,5 = 2^3×0 + 2^2×1 + 2^1×0 + 2^0×1
,因此,我们将a^5
转化为算 a^(2^3×0 + 2^2×1 + 2^1×0 + 2^0×1)
,即a^(2^0) × a^(2^2)
。
我们先算出所有2的幂,然后在算出所有x的2的幂次方。再把n拆成二进制,把二进制当中对应位置是1的值乘起来,就得到了结果。这套方法称为 快速幂法。
C# 实现
public class Solution
{
public double MyPow(double x, int n)
{
int neg = n < 0 ? -1 : 1;
long g = Math.Abs((long)n);
double[] d = new double[32];
d[0] = x;
for (int i = 1; i < 32; i++)
{
d[i] = d[i - 1] * d[i - 1];
}
double result = 1.0d;
for (int i = 0; i < 32; i++)
{
int mask = 1 << i;
if ((mask & g) != 0)
{
result *= d[i];
}
}
return neg != -1 ? result : 1.0 / result;
}
}
Python 实现
class Solution(object):
def myPow(self, x, n):
"""
:type x: float
:type n: int
:rtype: float
"""
neg = -1 if n < 0 else 1
n = abs(n)
d = list()
d.append(x)
for i in range(1, 32):
d.append(d[-1] * d[-1])
result = 1.0
for i in range(32):
mask = 1 << i
if (mask & n) != 0:
result *= d[i]
return result if neg != -1 else 1.0 / result