pow(x,n)的实现

class Solution {
public:
    double myPow(double x, int n) {
        if(n==0||x==1) return 1;
        if(x==0) return 0;
        double pro=1;
        long long p=abs((long long)n);  //(1)
        while(p){
            if(p&1) pro*=x;  //(2)
            p=p>>1;  //(3)
            x*=x;
        }
        return (n>0)?pro:1/pro;
    }
};

(1)处:此处考虑了n为负数时候的情况,为了计算方便,先将n取绝对值,但是当n为INT_MIN,即-214748364时,若p仍为int型变量,p最大只能表示2147483647,会发生溢出,所以要改成long long类型。

(2)处:判断p是奇数还是偶数,若是奇数,与1做&运算后,结果是1,若是偶数则是0;

(3)处:将p左移1位,即除以2;

该算法的时间复杂度为log(N),思路为:将基数x不断做平方运算,同时指数n不断除2,直到指数n等于0为止,但是由于指数存在奇数的情况,所以遇到指数为奇数的情况,就将基数单独乘在乘积中;最后求出pro后,若n为负数,则取倒数,得到结果。
如求2^13:
x=2,n=13,p=n=13;
p= 13是奇数,所以pro=pro*x=2,p=p/2=6,x=4;
p= 6是偶数,所以pro=2不变,p=p/2=3,x=4^2=16;
p= 3是奇数,所以pro=pro*x=32,p=p/2=1,x=16^2=256;
p= 1是奇数,所以pro=pro*x=8192,p=p/2=0,x=256^2(此时这个数已经不重要了);
p=0,退出循环,pro=8192;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值