剑指offer_发散思维---数值的整数次方

简介: 剑指offer_发散思维---数值的整数次方

##题目描述

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

##解题思路

主要涉及完整性考虑,首先按照正数次幂,负数次幂,0次幂,三种分析,底数为0和非0。

1,第一种方式,常规做法

2,第二种方式,用递归的方法,效率提高

3,第三种方式,用快速幂的方法,可以实现递归的效果

##代码实现

/**
 * 
 */
package 发散思维;
/**
 * <p>
 * Title:Power
 * </p>
 * <p>
 * Description:
 * </p>
 * 
 * @author 田茂林
 * @data 2017年8月25日 上午9:49:35
 */
public class Power {
  /**
   * void
   * 
   * @param args
   */
  public static void main(String[] args) {
    System.out.println(DouPowerSuperMax(-2.0, -3));
  }
  // ==================================================================常规方法
  public static double DouPower(double base, int exponent) {
    if (base == 0) {
      return 0;
    }
    if (exponent > 0) { // 正数次幂
      double result = 1;
      for (int i = 1; i <= exponent; i++) {
        result *= base;
      }
      System.out.println(result);
      return result;
    } else if (exponent < 0) {
      double result = 1;
      for (int i = 1; i <= -exponent; i++) { // 负数次幂
        result *= base;
      }
      return 1 / result;
    } else { // 任何数的0次幂都是1
      return 1;
    }
  }
  // ==================================================================递归方式
  public static double DouPowerSuper(double base, int exponent) {
    if (exponent > 0) {
      return helper(base, exponent);
    } else {
      return 1.0 / helper(base, exponent);
    }
  }
  public static double helper(double base, int exponent) {
    if (exponent < 0) {
      exponent = -exponent;
    }
    if (exponent == 0) {
      return 1;
    }
    if (exponent == 1) {
      return base;
    }
    double result = helper(base, exponent >> 1); // 递归方式可以让指数成倍的增长,减少运算次数
    result *= result;
    if ((exponent & 1) == 1) {
      result *= base; // 如果是奇数,要多乘一次
    }
    return result;
  }
  // ==================================================================快速幂方式
/**
 * 1.全面考察指数的正负、底数是否为零等情况。
 * 2.写出指数的二进制表达,例如13表达为二进制1101。
 * 3.举例:10^1101 = 10^0001*10^0100*10^1000。
 * 4.通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。
 */
  public static double DouPowerSuperMax(double base, int exponent) {
    int flag = exponent;
    if (base == 0)
      return 0;
    if (exponent == 0) {
      return 1;
    }
    if (exponent < 0) {
      exponent = -exponent;
    }
    int res = 1;
    while (exponent != 0) {
      if ((exponent & 1) != 0) {
        res *= base;
      }
      base *= base;
      exponent = exponent >> 1;
    }
    return flag > 0 ? res : 1.0 / res;
  }
}


相关文章
|
6月前
|
算法 测试技术 C++
【动态规划】【数学】【C++算法】1449. 数位成本和为目标值的最大数字
【动态规划】【数学】【C++算法】1449. 数位成本和为目标值的最大数字
|
6月前
|
算法
【一刷《剑指Offer》】面试题 11:数值的整数次方
【一刷《剑指Offer》】面试题 11:数值的整数次方
|
6月前
|
算法 测试技术 C#
【二进制求公约数】【数学】【数论】2543. 判断一个点是否可以到达
【二进制求公约数】【数学】【数论】2543. 判断一个点是否可以到达
|
6月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
90 0
|
机器学习/深度学习 C语言
C语言:给定两个数,求这两个数的最大公约数(新思路:辗转相除法)
思路一:普通方法 总体思路: (一). 生成相关变量; 从键盘输入两个数;
142 0
C语言:给定两个数,求这两个数的最大公约数(新思路:辗转相除法)
|
算法
剑指Offer - 面试题16:数值的整数次方
剑指Offer - 面试题16:数值的整数次方
55 0
|
存储 算法
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
140 0
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
|
算法
求两个数对应二进制位不同的个数(深度剖析+补充例题)
求两个数对应二进制位不同的个数(深度剖析+补充例题)
169 0
求两个数对应二进制位不同的个数(深度剖析+补充例题)
|
存储 机器学习/深度学习 人工智能
【Python 百练成钢】DNA、蛇形矩阵、Huffuman树、K-进制数、K倍区间、交换瓶子、第几个幸运数、四平方和、The 3n + 1 problem、大数乘法
【Python 百练成钢】DNA、蛇形矩阵、Huffuman树、K-进制数、K倍区间、交换瓶子、第几个幸运数、四平方和、The 3n + 1 problem、大数乘法
【Python 百练成钢】DNA、蛇形矩阵、Huffuman树、K-进制数、K倍区间、交换瓶子、第几个幸运数、四平方和、The 3n + 1 problem、大数乘法
|
算法 Java
Java实现2个数字的平方和等于一个数字(leetcode算法题)
Java实现2个数字的平方和等于一个数字(leetcode算法题)
271 0
Java实现2个数字的平方和等于一个数字(leetcode算法题)