Leetcode|Pow(x,n)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mike_learns_to_rock/article/details/47400895

Implement pow(x, n).
x是double类型,n是int类型;

边界条件:x==0和n==0
n为负数: 结尾取个倒数即可
效率问题:
解法1:一个一个乘,肯定超时。
解法2:用2的m次方和n比较。因为n可以表示成2的m次方的多项式相加的形式。
问题是:表示2的n次方(用移位表示),1<<30是(INT_MAX/2) ,1<<31 就是INT_MIN。
但是n==INT_MAX的情况怎么办呢。比如,输入0.00001, 2147483647 超时。
//无法处理INT_MAx的代码,多项式的运用。

double myPow(double x, int n) {
    if(x==0) return 0;
    if(n==0) return 1;
    bool isNeg=false;
    unsigned int pos=n;
    if(n<0) {
        isNeg=true;
        pos=-n;//有问题,INT_MIN
    }

    double res=1;
    int bit=0;//记录n和2的幂的关系
    for(;(1<<bit)<=pos;bit++);
    bit--;
    double pow[bit+1];
    for(int i=0;i<=bit;i++){//数组存不完全,最多到x的2^30次方
        if(i==0) pow[i]=x;
        else pow[i]=pow[i-1]*pow[i-1];
    }

    for(int i=bit;pos>0&&i>=0;i--){
        if(pos>=(1<<i)){
            res*=pow[i];
            pos-=1<<i;
        }
    }
    return (!isNeg) ? res : (1/res);
    }

解法3:利用x=x*x 来快速减少n,以指数的速度减少。
利用无符号的整型保存n;
n为偶数的话,x=x*x,n>>1; n迟早都会是1,利用n为奇数时候res*=x;
n为奇数的话,res*=x;

例如n==15; 第一次检验n为奇数,res*=x;
n变为7,x变为2次方。
n为奇数,res*=x;(res为x的三次方)
n变为3,x为4次方。
n为奇数,res*=x;
。。。
res=1*x^1*x^2*x^4*x^8;
AC的代码。

double myPow(double x, int n) {
if(x==0) return 0;
if(n==0) return 1;
bool isNeg=false;
unsigned int pos=n;
double res=1;
if(n<0) {
isNeg=true;
pos=-n;
}
while(pos){
if(pos&1){
res*=x;
}
pos>>=1;
x*=x;
}
return (!isNeg) ? res : (1/res);
}

猜你喜欢

转载自blog.csdn.net/mike_learns_to_rock/article/details/47400895
今日推荐