Pow(x,n) - LeetCode

Pow(x,n) = x^n


思路:

if(x<0) 结果的正负取决于n的奇偶

if(n<0) x的结果是倒数

希望把n当做正数处理。但是if(n == INT_MIN)时,取绝对值会越界,需要单独处理

n可以看成是以2为基地的一个正数 n=5 => n=101

第0位对应于2^0, 第1位对应于2^1, 第2位对应于2^2,...

而n又是x的指数项。所以对应于  x^1, x^2, x^4, x^8...

所以x就可以按照翻倍的计算,效率了。


注:如果要求严格还要判断越不越界, 因为有乘法。LeetCode中没有检查。


时间复杂度

O(logn)  因为我们把na按位来算的。

若是Brute Force, x乘n次: O(n) 


Code (C++):

#define DBL_EPSILON 2.2204460492503131E-16
#define DBL_MAX 1E+37
#define DBL_MIN 1E-37
class Solution {
public:
    double myPow(double x, int n) {
        if(x == 0) return 0;
        if(n == 1) return x;
        int sign = 1;
        double res = 1;
        if(x < 0 && n%2 == 1) sign = -1;
        x = abs(x); //x在计算完符号以后就要取绝对值了,否则影响后面的
        
        if(n < 0) 
        {
            x = 1.0/x; //if(DBL_MAX > 1.0/x || 1.0/x > DBL_MIN)  x = 1.0/x...
        }
        if(n == INT_MIN)
        {
            res = res*x;
            n++;
        }
        n = abs(n);
        while(n!=0) 
        {
            if(n&1)
            {
                res = res*x;  //if(DBL_MAX/x<res) return DBL_MAX;
            }
            x = x*x;  // x^(2^1), x^(2^2),x^(2^3)
            n >>= 1;
        }
        return res*sign;
    }
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值