用Java实现我自己的pow函数

时间:2016-04-19 17:16:53

标签: java algorithm

这是一个受欢迎的采访问题。实现我自己的战俘功能。 网上有一些流行的递归方法,但我试图迭代地进行。该代码适用于n> 0,但是当它低于0时,我有点迷失。这是我的代码。

 public double myPow(double x, int n) {

        if(x == 0) return 0;
        if(n == 0) return 1;

        double result = 1;
        if(n > 0 ){
            for(int i=1; i <= n; i++){
                result = result * x;
            } 
        }else{
            for(int i=1; i<= n; i++){

               //calculate the nth root 
            }
        }

        return result;
    }

计算第n个根时有任何帮助。

3 个答案:

答案 0 :(得分:1)

我想你可以这样做:(因为x ^( - n)= 1 / x ^ n)

double positive_pow(double x, int n) {

        if(x == 0) return 0;
        if(n == 0) return 1;

        double result = 1;
        if(n > 0 ){
            for(int i=1; i <= n; i++){
                result = result * x;
            } 
        }else{
            for(int i=1; i<= n; i++){

               //calculate the nth root 
            }
        }

        return result;
    }

public double pow(double x, int n) {
    if (n > 0) return positive_pow(x, n);
    else if (n == 0) return 1;
    else return 1 / positive_pow(x, 0-n);
}

这不是实现这一目标的最短方式,但它基于您的基本功能,并且比递归计算它或弄乱Math函数更清晰。

答案 1 :(得分:0)

这会奏效。

  

此代码也将返回负面权力的结果。为了解释,我使用变量int p= x来计算负幂......

public static double Pow(int x,int n){
    if(x == 0) return 0;
    if(n == 0) return 1;

    double result = 1;
    if(n > 0 ){
        for(int i=1; i <= n; i++){
            result = result * x;
        } 
    }

    else{

        int p=x;

        for(int i=0; i>n; i--){
            if(result==1){
                result= 1/(result*x);
                result++;
            }

            else{
                p=p*x;  
                result= (1.0)*1/p;
            }

        }
    }
    return result;
}

答案 2 :(得分:-1)

试试这个,我在练习Java的时候写了这个。该想法是5 ^ 62 = 5 ^(32 + 16 + 8 + 4 + 2)= 5 ^ 32 * 5 ^ 16 * 5 ^ 8 * 5 ^ 4 * 5 ^ 2,并且在二进制代码中,62是00111110。

以下是代码:

double pow(double x, int n){
    int i;
    double result;
    result = 1;
    i = x;
    while(n != 0){
        if(n & 1 == 1){
            result *= i;
        }
        i *= i;
        n>>1;
    }
    return result;
}