剑指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月前
|
Java 开发者
【编程基础知识】2的n次幂与二进制位全为1之间的联系,为啥只差一个1
本文深入探讨了2的n次幂与二进制位全为1之间的数学联系,解释了2的n次幂减一的二进制表示为何全为1,并探讨了这一特性在HashMap中的应用。通过基础数学原理和实际代码示例,文章揭示了这一特性的实用价值,适合各水平的编程爱好者学习。
26 3
|
7月前
|
算法
【一刷《剑指Offer》】面试题 11:数值的整数次方
【一刷《剑指Offer》】面试题 11:数值的整数次方
|
7月前
|
算法 测试技术 C#
【动态规划】【 数位dp】2827. 范围中美丽整数的数目
【动态规划】【 数位dp】2827. 范围中美丽整数的数目
|
7月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
102 0
|
算法
剑指Offer - 面试题16:数值的整数次方
剑指Offer - 面试题16:数值的整数次方
61 0
|
Python
深入理解动态规划算法 | 凑整数
深入理解动态规划算法 | 凑整数
142 0
|
算法 Java
leetcode每日一题:1005. K 次取反后最大化的数组和
leetcode每日一题:1005. K 次取反后最大化的数组和
|
存储 算法
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
147 0
【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法
leetcode-829. 连续整数求和(数论)
这题求连续正整数,刚好满足等差数列,可以用等差数列求和公式 n = (i + (i + k)) * (k + 1) / 2 其中i是连续正整数的首项,k是尾项和首项的差值
120 0
leetcode-829. 连续整数求和(数论)
|
存储 算法 前端开发
力扣-字符串相乘 中等 🎊
力扣-字符串相乘 中等 🎊
99 0
力扣-字符串相乘 中等 🎊