给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 保证base和exponent不同时为0

方法一:使用内置函数Math.pow(base,exponent)

方法二:暴力递归解法

public class Solution {
    public double Power(double base, int exponent) {
        if(exponent==0&&base!=0){
            return 1D;
        }
        if(exponent==1){
            return base;
        }
        if(exponent>1){
            return Power(base,exponent-1)*base;
        }
        if(exponent<0){
            return 1/(Power(base,-exponent-1)*base);
           }
      return 0;
}
}

方法三:快速幂算法,非递归实现

例如求a的11次方,记作a^11.

  a^11 = a(2  ^ 0 + 2 ^ 1 + 2 ^ 3) = a ^(1011);

所以,我们得出结果:a^11 = (a ^ (2 ^ 3)) *( a ^(2 ^ 1)) *( a^(2 ^ 0));

寻找其规律,得知每次它的基数会变成其平方,详细看代码

public class Solution {
    public double Power(double base, int exponent) {
        if(exponent==0&&base!=0){
            return 1D;
        }
        if(exponent==1){
            return base;
        }
        int exp=exponent>0?exponent:-exponent;
         double result=1;
        while(exp>0){
            if( (exp&1)==1){
                result*=base;
            }
            exp>>=1;
            base*=base;
        }
      return exponent>0?result:1/result;
}
}

方法四:快速幂算法,递归实现

例如:

  a^11  = a ^(1011);
  a^(1011)=[ (  a^(101) )^2 ]* a;  //最后一位为1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  a^10  = a ^(1010);
  a^(1010)=[ (  a^(101) )^2 ];   //最后一为为0
可以发现,将exponent右移后的结果与原来的结果的关系

注意:

1.递归出口为exponent为1,返回base

代码:

public class Solution {
    public double Power(double base, int exponent) {
        if(exponent==0&&base!=0){
            return 1D;
        }
        if(exponent==1){
            return base;
        }
        int exp=exponent>0?exponent:-exponent;
        double result=pow(base,exp);
        
      return exponent>0?result:1/result;
}
    
    public static double pow(double base, int exponent){
          if(exponent==0&&base!=0){
            return 1D;
        }
        if(exponent==1){
            return base;
        }
        double result=pow(base,exponent>>1);
        result*=result;
        if((exponent&1)==1){
            result*=base;
        }
        return result;
    }
}
发布了41 篇原创文章 · 获赞 1 · 访问量 1884

猜你喜欢

转载自blog.csdn.net/qq_38087131/article/details/104901367