面试题 11
2015-09-06 10:56
666 查看
1 题目描述
题目:实现函数 double Power(double base,int exponent),求exponent 次方,不得使用库函数,同时不考虑大数问题。算法描述
base^exponent一般情况 base>=0 exponent>=0
特殊情况 base=0 exponent<0 此时计算需要进行 /0 操作,导致错误
特殊情况 base=0 exponent=0,0^0 在数学上没有意义,可以返回 0 或者 1
C 语言实现
#include<stdio.h> int invalidInput=0; int equal(double base){ if(base-0.0>-0.0000001&&base-0.0<0.0000001){ return 1; }else{ return 0; } } double powerWithUnsignedExponent(double base,int exponent){ if(exponent==1) return base; if(exponent==0) return 1; double result=powerWithUnsignedExponent(base,exponent>>1); result=result*result; if(exponent&1==1){ result*=base; } return result; } double Power(double base,int exponent){ double result=0.0; if(equal(base)&&exponent<0){ invalidInput=1; return result; } unsigned int absExponent=(unsigned int)exponent; if(exponent<0){ absExponent = (unsigned int)(-exponent); } result=powerWithUnsignedExponent(base,absExponent); if(exponent<0){ result=1/result; } return result; } void main(){ printf("%f ",Power(2,3)); printf("%d\n",invalidInput); printf("%f ",Power(2,-3)); printf("%d\n",invalidInput); printf("%f ",Power(0,-3)); printf("%d\n",invalidInput); printf("%f ",Power(0,0)); printf("%d\n",invalidInput); }
注意事项
1 代码完成性:功能测试、边界测试、负面测试2 处理错误的三种方法,通常有 3 种方式将错误信息传递给调用者,函数返回值,设置全局变量和抛出异常。每一种方法都有局限,本例中使用全局变量记录错误信息。
3 使用移位操作代替 *2 操作,使用 &1 代替 奇偶数判定 操作,效率会更高。
a^n = a^(n/2) * a^(n/2) n为偶数 a^n = a^(n-1/2) * a^(n-1/2)*a n为奇数
4 用递归的方式可以实现 O(lgn) 时间复杂度求解 a^n。
5 由于计算机表示小数都有误差,不能直接使用等号判断两个小数是否相等,如果两个小数的差的绝对值很小,比如小于0.0000001,就可以认为他们相等。
相关文章推荐
- 剑指offer——面试题43:n个骰子的点数
- 非比较排序和大量数据找中位数面试题(2)
- 非比较排序和大量数据求中位数的一道面试题(1)
- 黑马程序员之正则表达式
- 程序员:如果不能自学,那就放弃吧
- 关于fork()输出的面试题
- 剑指Offer第三章面试题(Java版)
- 相爱相杀:程序员的数学
- 黑马程序员----oc加强笔记----Foundation\NSString
- 程序员的 13 种噩梦,你遇到过哪些?
- 程序员自学/自我培训指南
- 黑马程序员—Java集合框架
- 黑马程序员————java基础————面向对象
- 华为IT产品线面试总结
- 黑马程序员————java基础————反射
- 程序员联盟有自己的论坛啦!基于Discuz构建,还不来注册~
- 程序员联盟有自己的论坛啦!基于Discuz构建,还不来注册~
- 野生程序员的故事
- Java程序员应该知道的10个调试技巧
- 腾讯后台开发面试题--整理3