剑指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;
  }
}


相关文章
|
2月前
|
算法
【一刷《剑指Offer》】面试题 11:数值的整数次方
【一刷《剑指Offer》】面试题 11:数值的整数次方
|
2月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
54 0
|
算法
剑指Offer - 面试题16:数值的整数次方
剑指Offer - 面试题16:数值的整数次方
37 0
|
存储 算法
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
123 0
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
leetcode-829. 连续整数求和(数论)
这题求连续正整数,刚好满足等差数列,可以用等差数列求和公式 n = (i + (i + k)) * (k + 1) / 2 其中i是连续正整数的首项,k是尾项和首项的差值
92 0
leetcode-829. 连续整数求和(数论)
和为s的连续正数序列----滑动窗口经典题目(简单难度)
和为s的连续正数序列----滑动窗口经典题目(简单难度)
76 0
和为s的连续正数序列----滑动窗口经典题目(简单难度)
|
算法 Java API
基础算法练习200题15、整数累加
基础算法练习200题15、整数累加
101 0
基础算法练习200题15、整数累加
|
算法 Java
Java实现2个数字的平方和等于一个数字(leetcode算法题)
Java实现2个数字的平方和等于一个数字(leetcode算法题)
239 0
Java实现2个数字的平方和等于一个数字(leetcode算法题)
|
算法 前端开发 程序员
「LeetCode」剑指Offer-16数值的整数次方⚡️
「LeetCode」剑指Offer-16数值的整数次方⚡️
85 0
「LeetCode」剑指Offer-16数值的整数次方⚡️
|
存储 Java
漫画:如何实现大整数相加?(修订版)
本周一发布的漫画,存在一些细节上的问题,在这里做出如下修改:1.修改了代码中进位判断条件的bug,优化了部分代码的可读性。2.增加了JDK工具类BigInteger和BigDecimal的说明。3.补充了一个优化方法,即把大整数拆分成数组时,按十进制每9位拆分,而非每1位拆分。把整数倒序存储,整数的个位存于数组0下标位置,最高位存于数组长度-1下标位置。之所以倒序存储,更加符合我们从左到右访问数组的习惯。
103 0
漫画:如何实现大整数相加?(修订版)