数值的整数次方

question:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

resolution1:

该方法是一个比较投机取巧的方法,直接利用了Java的库函数,当然面试中还是不建议采取这种方法的

 public double Power(double base, int exponent) {
        double result = Math.pow(base, exponent);
        return result;
  }

resolution2:

该方法应该算是一个比较常规的方法,根据指数的大小分为>0,<0,==0三种情况

double Power(double base, int exponent) {
        double result = 1;
      if(exponent > 0){
          for(int i = 1; i <= exponent; i++){
              result *= base;
          }
      }else if(exponent < 0){
          if(base == 0){
              throw new RuntimeException("分母不能为0");
          }else {
              for(int i = 1; i <= Math.abs(exponent); i++){
                  result *= base;
              }
              result = 1 / result;
          }
      }
      return result;
    }

resolution3:快速求幂算法

我想出题人的意图应该就是利用P进制的移位算法来求解幂,通过该种算法,可以大大降低乘法次数。下面采用得是2进制算法。也可以采用8进制,16进制等等。只是current的步长就不是 平方,而是p进制的平方,比如八进制,那么current = 5的八次方 * 5的八次方

  double Power(double base, int exponent) {

        if(exponent < 0 && base == 0) throw new RuntimeException("分母不能为0");
        if(base == 0) return 0;
        int exponent1 = Math.abs(exponent);
        double result = 1.0;
        double current = base;
        //判断最后一位二进制是否为1或者判断exponent1是否为奇数,将exponent1 & 1改为exponent1%2
        while((exponent1 & 1) == 1){
            result *= current;
            current *= current;
            exponent1 = exponent1 / 2;//也可以用右移代替
//            exponent1 = exponent1 >> 1;
        }
        current *= current;
        //输出判断
        if(exponent < 0){
            result = 1 / result;
        }
        return result;
    }
欢迎关注我的公众号:小秋的博客 CSDN博客:https://blog.csdn.net/xiaoqiu_cr github:https://github.com/crr121 联系邮箱:rongchen633@gmail.com 有什么问题可以给我留言噢~
原文地址:https://www.cnblogs.com/flyingcr/p/10326838.html