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 有什么问题可以给我留言噢~
  • 相关阅读:
    2014 非常好用的开源 Android 测试工具
    Android 开发最佳实践
    Java_综合案例DAO设计模式(重要)
    Java_Set接口
    Java_List
    Java_类集框架简介
    Java_对象序列化
    Java_打印流
    Java_IO编程
    Java_文件操作
  • 原文地址:https://www.cnblogs.com/flyingcr/p/10326838.html
Copyright © 2011-2022 走看看