题目
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
程序核心思想
这个题目就是把所有情况罗列出来就可以了,分类讨论。
要想到,指数要区分大于0、等于0、小于0的情况,因为指数小于0的时候,会出现倒数。
由于会出现倒数,就要考虑到分母为不为0的问题,所以,又要考虑底数是不是0.
所以一共有3*2=6种情况:
序号 | 情况 | 结果 |
---|---|---|
1 | 底数 = 0,指数 > 0 | for循环正常算 |
2 | 底数 = 0,指数 = 0 | 1(没意义,但是编译器里的结果为1) |
3 | 底数 = 0,指数 < 0 | ∞(根据底数是正0还是负0,有正无穷和负无穷两种情况) |
4 | 底数 != 0,指数 > 0 | for循环正常算 |
5 | 底数 != 0,指数 = 0 | 1 |
6 | 底数 != 0,指数 < 0 | 1 / for循环正常算 |
会出现四种情况(底数不管是不是0,只要指数为0,结果就是1;只要指数大于0,结果就是正常算)。整理如下:
序号 | 情况 | 结果 |
---|---|---|
1 | 指数 = 0 | 1 |
2 | 指数 > 0 | for循环正常算 |
3 | 底数 = 0,指数 < 0 | ∞(根据底数是正0还是负0,有正无穷和负无穷两种情况) |
4 | 底数 != 0,指数 < 0 | 1 / for循环正常算 |
按照这四种情况编程即可。
Tips
- double类型的数是不是0不能通过简单的==来计算,应该看它的绝对值是否小于一个足够小的数。
Math.abs(base) < Math.exp(-6)
- double 类型的除法(体现在本题中就是对结果取倒数),要注意自动类型转换和强制类型转换。
return normal(base, exponent);
- 正无穷和负无穷的表示方法:Double.POSITIVE_INFINITY和Double.NEGATIVE_INFINITY
代码
public class Solution {
public double Power(double base, int exponent) {
if(exponent == 0){
return 1;
}
int flag_1 = 1; //正
if(exponent < 0){
exponent *= -1;
flag_1 = 0; //负
}
int flag_2 = 1;//不是0
if(Math.abs(base) < Math.exp(-6)){
flag_2 =0; //0
}
if(flag_1 == 1){
return normal(base, exponent);
}else{
if(flag_2 == 1){
return 1.0 / normal(base, exponent);
}else{
if(base > 0){
return Double.POSITIVE_INFINITY;
}else{
return Double.NEGATIVE_INFINITY;
}
}
}
}
public double normal(double base, int exponent){
int answer = 1;
for(int i = 0; i < exponent; i++){
answer *= base;
}
return answer;
}
}