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

 

posted @ 2020-05-27 10:24  超级学渣渣  阅读(185)  评论(0编辑  收藏  举报