题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
题目分析
很多人看到这个题基本上心里马上就有一个大致的思路了,就是用一个循环来做base的exponent次方,于是代码很快就能出来
public double solution(double base,int exponent){
double result = 1.0;
for(int i=0;i<exponent;i++){
result = result * base;
}
return result;
}
但是上面的代码只考虑到指数为正整数情况,指数为0或者为负整数情况却没有考虑到。当指数为负数的时候,可以先对指数求绝对值,然后算出次方的结果之后再取倒数。既然有求倒数,我们很自然的就要想到有没有可能对0求倒数,如果对0求倒数怎么办?当底数base是零且指数是负数的时候,我们不做特殊的处理,就会发现对0求倒数从而导致程序运行出错。那么此时我们就要通过抛出异常来反馈这个问题,下面上正确的代码
public class Solution{
public double Power(double base,int exponent){
double result = 1.0;
//当指数为0
if(exponent ==0){
return 1.0;
}
//当底数无限接近于0 并且指数为负数时,计算时候需要对底数求倒数,此时计算非法
if(isEqual(base,0.0) && exponent<0){
throw new Exception("计算非法");
}
if(exponent >0){
result = multiply(base,exponent);
}else{
result = multiply(1.0/base,-exponent);
}
return result;
}
public boolean isEqual(double a, double b){
if(a-b<0.000001 && a-b>-0.000001){
return true;
}
return false;
}
public double multiply(double base,int exponent){
double sum =1.0;
for(int i=0;i<exponent;i++){
sum = sum * base;
}
return sum;
}
}