剑指offer面试题11 数值的整数次方 java实现

来源:互联网 发布:联合国维和行动 知乎 编辑:程序博客网 时间:2024/06/03 14:52

解题思路:

这道题看起来很简单,但还是有些地方还要仔细观察才能发现陷阱。

1.当指数大于等于0的时候,底数可以取任意double类型的值,这里暂不考虑0的0次方是1还是0。

2.当指数小于0时:

(1)如果底数为0,则在取倒数的时候会出现分母为0的情况,这是计算机不允许的,这里让函数返回0.0,然而函数返回0.0可能还有另一种情况,即当指数>0,底数为0时,结果也为0.0。因此为了区分这种情况,需要设置一个成员变量invalidInput,用来标记输入是否合法。还有一个地方需要注意,在判断底数是否为0时,由于==不能判断两个小数是否相等,因此只能使用底数与0.0之差的绝对值是不是在一个很小的范围之内,如果是,则认为底数与0.0相等。

(2)如果底数不为0,先求出指数为正数时候的值,在取倒数。


/** * 数值的整数次方 * @author wuxinkai * */public class Solution {boolean invalidInput = false;public double Power(double base, int exponent) {double result = 1.0;if (exponent >= 0) {//如果指数大于等于0,那么底数可以取任意double值result = getPowerWithUnsignedExponent(base, exponent);} else {//如果指数小于0if (Math.abs(base - 0.0) < 0.0000001) {//判断两个小数是否相等,只能用他们之差的绝对值是不是在一个很小的范围内进行判断//如果base的值和0相等,double类型无法equals,因此只能是和0的值小于一定程度//时可以默认为0,而且必须加上绝对值,防止当base是小数时,肯定满足条件//当底数为0指数为负数时,无意义,证明输入有误invalidInput = true;result = 0.0;} else {//当底数不为0的时候,先求出指数为正数时的值double temp = getPowerWithUnsignedExponent(base, -exponent);//取倒数result = 1 / temp;}}return result;}private double getPowerWithUnsignedExponent(double base, int exponent) {double result = 1;for (int i = 1; i <= exponent; i++) {result *= base;}return result;}}


原创粉丝点击