pow(x,n)的实现

来源:互联网 发布:空间句法分析软件知乎 编辑:程序博客网 时间:2024/05/24 15:42
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;

0 0
原创粉丝点击