zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    jenkins代码自动部署
    jenkins安装
    git图形管理工具
    gitlab自动备份恢复与卸载
    linux下获取外网IP
    网站安全webshell扫描
    jQuery动画效果实现
    form表单中的enctype属性什么意思?
    你那么努力又怎么样!
    话语
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4064056.html
Copyright © 2011-2022 走看看