zoukankan      html  css  js  c++  java
  • 数值的整数次方

    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 有什么问题可以给我留言噢~
  • 相关阅读:
    Dubbo服务提供者Provider启动流程下(四)
    修改超链接的默认格式
    给 3Com 3C940 Gigabit LOM 安装Windows Server 2008 驱动
    Express版SQL定时备份BAK文件(SQL2005,SQL2008)
    DataGridView的行、列调整
    更新DNS缓存
    VB.Net类型转换——全角半角间转换(StrConv)
    VB.Net 获取或者转换时间不受系统时间格式影响
    Active Desktop
    VB.Net类型转换——全角半角间转换(StrConv)
  • 原文地址:https://www.cnblogs.com/flyingcr/p/10326838.html
Copyright © 2011-2022 走看看