题目:

实现函数double power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。

解题思路:最一般的方法实现数值的n次方就是将一个数自身连乘n次
底数要考虑到正数、负数和零的情况
指数要考虑到正整数,负整数和零的情况。可能的情况有九种,其中尤其要注意底数为0,指数为负数的情况下是无意义的,因此要做特殊处理
指数为负数的乘方运算,可先按照指数为正求得,然后求倒数得到真正结果
解法一:全面不高效,考虑到所有边界条件和负面测试使用循环计算乘方
解法二:全面高效完美的算法,使用公式,利用递归实现,减少计算次数

a^n=a^(n/2)*a^(n/2)    n是偶數

a^n=a^(n/2)*a^(n/2)&a   n是奇数

 package Solution;
/**
* 剑指offer面试题11:数值的整数次方
* 题目:实现函数double power(double base,int exponent),求base的exponent次方。
* 不得使用库函数,同时不需要考虑大数问题。
* 解题思路:实现数值的n次方就是将一个数自身连乘n次
* 底数要考虑到正数、负数和零的情况
* 指数要考虑到正整数,负整数和零的情况。因此可能的情况有九种,其中尤其要注意底数为0,指数为负数的情况下是无意义的,因此要做特殊处理
* 指数为负数的乘方运算,可先按照指数为正求得,然后求倒数得到真正结果
* 解法一:全面不高效,考虑到所有边界条件和负面测试
* 解法二:全面高效完美的算法,使用公式a^n=a^(n/2)*a^(n/2) n是偶數
* a^(n/2)*a^(n/2)&a n是奇数
* @author GL
*
*/
public class No11Power { public static void main(String[] args) {
System.out.println("底数为2,指数为2运算结果为:"+power(2,2));
System.out.println("底数为2,指数为-2运算结果为:"+power(2,-2));
System.out.println("底数为2,指数为0运算结果为:"+power(2,0));
System.out.println("底数为-2,指数为2运算结果为:"+power(-2,2));
System.out.println("底数为-2,指数为-2运算结果为:"+power(-2,-2));
System.out.println("底数为-2,指数为0运算结果为:"+power(-2,0));
System.out.println("底数为0,指数为2运算结果为:"+power(0,2));
System.out.println("底数为0,指数为0运算结果为:"+power(0,0));
System.out.println("底数为2,指数为1运算结果为:"+power(2,1));
System.out.println("底数为0,指数为-2运算结果为:"+power(0,-2));
} public static double power(double base,int exponent){
if(equal(base,0.0)&&exponent<0)
throw new RuntimeException("while exponent is minus,the base can't be zero");
int absExponent=exponent;
if(exponent<0)
absExponent=~exponent+1;//整数按位取反+1得到他的相反数
//double result=powerWithUnsignedExponent(base,absExponent);
double result= powerWithUnsignedExponentByRecursion( base, absExponent);
if(exponent<0)
result=1.0/result;
return result;
}
//解法一:求指数为非负数时候的乘方运算,连乘
private static double powerWithUnsignedExponent(double base, int absExponent) {
double result=1.0;
for(int i=1;i<=absExponent;i++){
result=result*base;
}
return result;
} //解法二:计算一个数的乘方的时候,通过计算指数的一半次,得到的结果相乘即可得到,这样计算量会大大减少
private static double powerWithUnsignedExponentByRecursion(double base,int exponent){
if(exponent==0)
return 1.0;
if(exponent==1)
return base;
double result= powerWithUnsignedExponentByRecursion(base,exponent>>1);
result=result*result;
if((exponent&0x1)==1)
result=result*base;
return result;
} //浮点数由于精度问题不能用==判断是否想等,如果两数满足一定条件精度,可以看做相等
private static boolean equal(double number1,double number2){
if(number1-number2>-0.0000001&&(number1-number2)<0.0000001)
return true;
return false;
}
}

剑指offer编程题Java实现——面试题11数值的整数次方的更多相关文章

  1. 剑指offer编程题Java实现——面试题5从头到尾打印链表

    题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...

  2. 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现

    用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具 ...

  3. 剑指offer编程题Java实现——面试题10二进制中1的个数

    题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变 ...

  4. 剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈

    剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()- ...

  5. 剑指offer编程题Java实现——面试题7用两个栈实现队列

    题目:用两个栈实现一个队列.队列的声明如下:请实现他的两个函数appendTail和deleteHead, 分别完成在队列尾部插入节点和在队列头部删除节点的功能. package Solution; ...

  6. 剑指offer编程题Java实现——面试题6重建二叉树

    题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2, ...

  7. 剑指offer编程题Java实现——面试题12打印1到最大的n位数

    题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了l ...

  8. 剑指offer编程题Java实现——面试题14调整数组顺序使奇数位于偶数之前

    题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初 ...

  9. 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 由于给定的是单向链表,正常删除链表的时间复杂度是查找链表的时间复杂度即O(n),如果要求在O(1)时间复杂度内删除节点 ...

随机推荐

  1. shell 整理,更新,记录

    菜鸟级awk,读取android manifest,把key->value 保存到path.rc. awk -F "name=" '{if(/project path/) p ...

  2. iOS 之 内存检查instrument

    经常听见iOS开发instrument是一个内存检查工具,但是,没想到,它是集成在xcode里面的,而且打开一看,感觉功能非常强大. 打开方式是 product -> profile 头一次运行 ...

  3. html <select> 用JS控制默认选中项

    <html> <head> <!--禁止页面缓存--><meta http-equiv="content-type" content=&q ...

  4. 分布式cookie-session的实现(spring-session)

    分布式cookie-session的实现(spring-session) 本文使用的spring-session版本为 1.0.0,地址为: https://github.com/spring-pro ...

  5. 使用 StateServer 保存 Session 解决 Session过期,登陆过期问题。

    使用 StateServer 保存 Session 正常操作情况下Session会无故丢失.因为程序是在不停的被操作,排除Session超时的可能.另外,Session超时时间被设定成60分钟,不会这 ...

  6. onfocus在火狐、ie10浏览器失效解决方法方法

    <script>      function setit(){      if(document.all){      document.getElementById("myfr ...

  7. Java中多线程原理详解

    Java是少数的集中支持多线程的语言之一,大多数的语言智能运行单独的一个程序块,无法同时运行不同的多个程序块,Java的多线程机制弥补了这个缺憾,它可以让不同的程序块一起运行,这样可以让程序运行更加顺 ...

  8. Java学习之旅开篇:运行机制及环境搭建

    在写这篇博客之前,我想对自己进行简单概括:我从事软件开发工作已经三年多了,并且一直在从事.NET相关项目的开发.为什么突然间想学习Java呢?有以下几个原因: 1. 开发程序三年多来,已经对.NET相 ...

  9. C#版--简单工厂模式

    为什么要用设计模式? 1.设计模式是前人根据经验总结出来的,使用设计模式,就相当于是站在了前人的肩膀上. 2.设计模式使程序易读.熟悉设计模式的人应该能够很容易读懂运用设计模式编写的程序. 3.设计模 ...

  10. PHP扩展之多线程

    PHP一直以为不支持多线程,后面才知道有基于pThread的扩展包,地址如下: http://php.net/manual/zh/book.pthreads.php 我感兴趣的是以下几个点: 1.Th ...