leetcode 50 Pow(x,n) 快速幂

Posted 行尸走肉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 50 Pow(x,n) 快速幂相关的知识,希望对你有一定的参考价值。

原题点这里

 

求一个数的幂。我们看一下数据范围。很容易就想到Math.pow()

public static double myPow(double x, int n) {
        return Math.pow(x,n);

    }
View Code

哈哈,其实这样有投机的成分。正经的解法:快速幂

我们以 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来保存。

 

以上是关于leetcode 50 Pow(x,n) 快速幂的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode50. Pow(x, n)(快速幂)

LeetCode50. Pow(x, n)(快速幂)

LeetCode 50. Pow(x, n)(快速幂,Java)

LeetCode 50 Pow(x, n)[快速幂 递归 迭代] HERODING的LeetCode之路

[LeetCode] 50. Pow(x, n)

[LeetCode] 50. Pow(x, n)