码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 50 Pow(x,n) 快速幂

时间:2020-05-27 10:37:59      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:难点   none   数值范围   int   hid   style   closed   blank   数据   

原题点这里

 

求一个数的幂。我们看一下数据范围。很容易就想到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) 快速幂

标签:难点   none   数值范围   int   hid   style   closed   blank   数据   

原文地址:https://www.cnblogs.com/superxuezhazha/p/12970951.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!