leetcode 50 Pow(x,n) 快速幂
原题点这里
求一个数的幂。我们看一下数据范围。很容易就想到Math.pow()
public static double myPow(double x, int n) { return Math.pow(x,n); }
哈哈,其实这样有投机的成分。正经的解法:快速幂
我们以 x^97为例(官方题解)
97(10)= 110 0001(2)
x^97 = x * x^32 * x^64
所以,我们将97的二进制计算出来,然后对于二进制中为1的对应的幂次,乘起来就可以了。
这就是快速幂。它以log2的速度计算一个数的幂
public double myPow(double x, int n) { double ans = 1.0; long N = n; long mulN = N>0?N:-N; while (mulN>0){ if(mulN%2==1) ans*=x; x*=x; mulN/=2; } return N>0?ans:1.0/ans; }
这里的难点,除了快速幂之外,还有一个,对数值范围的处理。
- -100.0 < x < 100.0
- n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
100^2^31是远远小于double的表示范围的。所以我们可以用double来保存计算结果。但是,对于int型的数据。如果是-2^31,它的正数超过了int 的表示范围。所以,我们要用long来保存。