0%

剑指offer016 数值的整数次方

Problem:

给定一个 double 类型的浮点数 base 和 int 类型的整数 exponent,求 base 的 exponent 次方。

Intuition:

这个题目的第一反应是不是一个for循环就搞定了吗?然后写下下面一段代码

1
2
3
4
5
6
7
8

public double Power(double base, int exponent){
double result = 1.0;
for (int i = 1; i <= exponent; i++) {
result *= base;
}
return result;
}

但是这样是明显会被面试官diss的,指数部分为0或者小于0的时候都没有处理,底数指数均为0的时候也没有抛出异常。

Solution:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 指数为正数的情况
public double powerWithExponent(double base, int exponent) {
double result = 1.0;
for (int i = 1; i <= exponent; i++) {
result *= base;
}
return result;
}

// 数值比较的方法
public boolean equal(double num1, double num2) {
if (Math.abs(num1 - num2) < 0.0000001) {
return true;
} else {
return false;
}
}

// 数值的整数次方
public double power(double base, int exponent) {
double result = 0.0;
// 首先比较底数为0,指数为负数的情况,这种情况没有意义
if (this.equal(base, 0.0) && exponent < 0) {
try {
throw new Exception("没有意义");
} catch (Exception e) {
e.printStackTrace();
}
}
// exponent的三种情况
if (exponent == 0) { // exponent为0的情况
return 1.0;
} else if (exponent < 0) { // exponent小于0的情况
result = this.powerWithExponent(1 / base, -exponent);
} else if (exponent > 0) { // exponent大于0的情况
result = this.powerWithExponent(base, exponent);
}
return result;
}