不用库,实现pow()运算
很简单的题目,但是涉及到很多细节

比如
1) 结果非法或者出错的时候如何通知调用者:
可以采用返回特定值的方法-但是此处pow运算既可以返回正数 0 或者负数,所以此思路比较麻烦
可以采用全局变量加上返回值的方法-缺点是比较容易忘记检查全局变量的标志
可以直接使用异常机制来实现-就是此处的方法了,虽然异常的缺点在于可能会导致程序执行流程的极大改变,但是比较方便

2) 输入的组合情况
base为正 exp为正 - 直接算
base为负 exp为正 - 直接计算
base为0 exp为正 直接返回0

base为正 exp为0 - 直接返回1
base为负 exp为0 - 直接返回1
base为0 exp为0 - 无意义,返回1

base为正 exp为负 - 正常计算后求倒
base为负 exp为负 - 正常计算求倒
base为0 exp为负 - 非法运算抛出异常

3) 其他的一些优化以及注意的细节
pow运算针对的都是浮点运算,所以精度有要求-浮点数大小对比需要不是和0而是和0.00…..0001
一些计算加速技巧-需要积累

public class _Q11 {public double Pow(double base, int exp) throws Exception{if(equals(base, 0.0) && (exp < 0)) { throw new Exception("invalid input, check the base");}if(equals(base, 0)) return 0;if(exp == 0) return 1;if(exp == 1) return base;if(exp < 0) return 1.0/PowWithUnsignedExpR(base, -exp);return PowWithUnsignedExp(base, exp);}/*** 这个地方看到书上是用的递归,代码挺巧妙的就是不易读 - 需要结合那个公式*/public double PowWithUnsignedExp(double base, int exp){double result = base;int count = 1;if((exp & 0x01) == 0){ // 指数为偶数while(count < exp){result = result*result;count = (count<<1);}}else{ // 指数为奇数while(count < (exp - 1)){result = result*result;count = (count<<1);}result = result * base;}return result;}public double PowWithUnsignedExpR(double base, int exp){// 出口if(exp <= 1) return exp*base;double result = PowWithUnsignedExpR(base, exp>>1);result *= result;if((exp & 0x01) == 1) result *= base; return result;}public boolean equals(double num1, double num2){boolean result = false;if((num1 - num2 < 0.00001) && (num1 - num2 > -0.00001)) result = true;return result;}}

测试代码:

public class _Q11Test extends TestCase {_Q11 pow = new _Q11();public void testMinInReverse() throws Exception{double base1 = 0.0;int exp1 = 2;double base2 = 0.0;int exp2 = -2;double base3 = 5;int exp3 = 1;double base4 = 5;int exp4 = -2;double base5 = 5;int exp5 = 0;double base6 = 5;int exp6 = 2;System.out.println(pow.Pow(base1, exp1));try {System.out.println(pow.Pow(base2, exp2));} catch (Exception e) {e.printStackTrace();}System.out.println(pow.Pow(base3, exp3));System.out.println(pow.Pow(base4, exp4));System.out.println(pow.Pow(base5, exp5));System.out.println(pow.Pow(base6, exp6));}}

【剑指offer-Java版】11数值的整数次方相关推荐

  1. 剑指offer面试题[11]-数值的正整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. (自己方法可以通过-比较low)后期补充牛客网解法,先mark一下. clas ...

  2. 剑指offer(12)数值的整数次方

    快速幂的算法太美了 对于if((b&1)==1)这是判断b是否为奇数: 例如:如果b=8(1000),即指数为8,进入循环时,b不是奇数,那么基数翻倍,现在base值为,然后b右移,此时b为4 ...

  3. 剑指offer面试题16. 数值的整数次方(二分法)

    题目描述 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 思路 详见链接 代码 cl ...

  4. 剑指offer java版 test3—从尾到头打印链表

    标题:剑指offer java版 test3-从尾到头打印链表 题目:输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 解答:知识不够全面,用ArrayList做的 但是看到大佬们还可以 ...

  5. 剑指offer没有java版吗_剑指Offer(Java版) 持续更新中

    面试题2 单例(之前有整理,略) 面试题3 二维数组中的查找 public boolean find(int target, int [][] array) { boolean found = fal ...

  6. 剑指offer java版(一)

    二维数组中的查找 问题描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数 ...

  7. 剑指offer java版 test42—找出和为S的两个数,左右夹逼法(双指针法)

    前言:受上一题的启发,这题自己也编出来了.在碰到这种有序数列的时候,经常会用到双指针法,一个指左边,一个指右边,然后依照规则移动,增加或缩小范围.很实用. 题目: 输入一个递增排序的数组和一个数字S, ...

  8. 剑指offer java版(三)

    二叉搜索树的后序遍历 问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路 对于后序遍历来说, ...

  9. 剑指Offer第二版Java代码实现

    剑指Offer第二版Java代码实现 A.单例模式 面试题 2:实现Singleton模式 B.面试需要的基础知识 面试题 3:数组中重复的数字 面试题 4:二维数组的查找 面试题 5:替换空格 面试 ...

  10. 剑指offer——面试题11:数值的整数次方

    剑指offer--面试题11:数值的整数次方 Solution1:基本算法 累乘,时间复杂度为O(n) 要考虑全部情况:指数 < 0, == 0 和 > 0. 注意在 if-else if ...

最新文章

  1. 洛谷P2633 Count on a tree
  2. OBJECT_METHOD初窥
  3. vba字典合并单元格为空_VBA合并单元格求和处理套路
  4. POJ1719行列匹配
  5. [Python]元组与列表的区别及内建用法
  6. 怎么将多个html组合_技巧分享之在HTML元素中添加逼真阴影的教程
  7. 曹大,欧神开新公众号了
  8. 【HDU - 4781】Assignment For Princess(图上构造)
  9. 二级VB培训笔记11:培训答疑集
  10. 各种排序方法的时间复杂度、空间复杂度和稳定性统计表
  11. The valid characters are defined in RFC 7230 and RFC 3986-Tomcat解决方案
  12. jquery $.fn $.fx $.extend
  13. python matplotlib 播放图片变化过程
  14. ip电话系统设计和实现
  15. html5制作当当图书榜页面,当当图书.html
  16. 设置border线条小于1px
  17. 常用图标(icon)css下载
  18. 关于安装mmdetection
  19. 联想电脑ctrl + r 快捷键无法使用
  20. 【网络驱动】GMAC 系统框架

热门文章

  1. wince车机可以连接电脑吗_想在WinCE车机上运行凯立德实时路况版吗?那就进来看看,让你一键傻瓜式联网...
  2. gradient设置上下渐变_iOS 绘制渐变·实例篇
  3. C++知识点27——使用C++标准库(常用的泛型算法2)
  4. 记录一下海上风力机机械装置
  5. C++种子点搜索算法之线扫描方法的实现
  6. Kubernetes(1) kubectl 入门
  7. 【安全牛学习笔记】手动漏洞挖掘(三)
  8. Linux下用户组、文件权限详解
  9. [SDOI2017]新生舞会
  10. Android 隐藏软键盘