leetcod Pow(x, n)

题目:就是实现一个指数函数。

直接用一个while一直乘以n词肯定是会超时的。

自己写了用递归(而且是很挫的递归),测试了无数次,根据每个case去修改代码。终于可以AC了。不忍直视,自己写了好长,如下:

class Solution {
public:
    double pow(double x, int n) {
    int flag1 = 0, flag2 = 0;
    if (n < 0)
    {
        flag1 = 1;
        if (n > INT_MIN)  n = -n;
        else
        {flag2 = 1; n = -(n + 1);}
    }
    if (n == 0 || x == 1)
        return 1;
    if (x == 0)
        return 0;
    int time = (int) (log(n)/log(2));
    double ans = x;
    int cnt = 1;
    while(time--)
    {
        cnt <<= 1;
        ans *= ans;
    }
    if(!flag2)
    {
        if (cnt == n)
        {   
            if(flag1)
                return 1/ans;
            return ans;
        }
        else
        {   
            if (flag1)
                return 1/(ans*pow(x, n - cnt));
            return ans*pow(x, n - cnt);
        }
    }
    else
    {
        if (cnt == n)
        {
            if (flag1)
                return 1/(ans*x);
            return ans*x;
        }
        else
        {
            if (flag1)
                return 1/(x*ans*pow(x, n-cnt));
            return x*ans*pow(x, n - cnt);
        }
    }
}
};
View Code

然后肯定要看看其他大神。用递归的,别人十几行就搞定了。

double pow(double x, int n) {  
    if (n == 0) return 1.0;  
    double half = pow(x, n/2);  
    if (n%2 == 0)  
    {  
        return half*half;  
    }  
    else if (n>0)  
    {  
        return half*half*x;  
    }  
    else  
    {  
        return half/x*half;  
    }  
}  

以下有一个没有用递归的。

public double pow(double x, int n) {  
    if(n==0)  
        return 1.0;  
    double res = 1.0;     
    if(n<0)  
    {  
        if(x>=1.0/Double.MAX_VALUE||x<=1.0/-Double.MAX_VALUE)  
            x = 1.0/x;  
        else  
            return Double.MAX_VALUE;  
        if(n==Integer.MIN_VALUE)  
        {  
            res *= x;  
            n++;  
        }  
    }  
    n = Math.abs(n);  
    boolean isNeg = false;  
    if(n%2==1 && x<0)  
    {  
        isNeg = true;  
    }  
    x = Math.abs(x);  
    while(n>0)  
    {  
        if((n&1) == 1)  
        {  
            if(res>Double.MAX_VALUE/x)  
                return Double.MAX_VALUE;  
            res *= x;  
        }  
        x *= x;  
        n = n>>1;  
    }  
    return isNeg?-res:res;  
}  
View Code
原文地址:https://www.cnblogs.com/higerzhang/p/4064056.html