题目
- 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路
-
浮点底数base情况
- 大于0:直接使用
- 等于0:特殊考虑
- 小于0:直接使用
-
整形指数e的情况
- 大于0:直接使用
- 等于0:正常使用
- 小于0:先对指数求绝对值,然后算出次方结果后再取倒数
-
综上所述,本题目需要单独考虑的因素为:底数为0并且指数小于0 的情况。如果不进行考虑就会出现对0求倒数的情况
-
还有一种情况是0的0次方,结果为0或者1,根据面试官的要求确定
-
对于出现0的负数次方的情况,常用的表示方法为:返回值、全局变量、异常
-
使用布尔型全局变量表示错误的情况
public class Solution {
boolean flag = false;
public double Power(double base, int exponent) {
if(base==0.0 && exponent<0){
flag=true;
return 0.0;
}
int absExponent =exponent;
if(exponent<0){
absExponent=-exponent;
}
double result = PowerWithUnsignedExponent(base,absExponent);
if(exponent<0){
result = 1.0/result;
return result;
}
return result;
}
public double PowerWithUnsignedExponent(double base, int exponent){
double result=1.0;
for(int i=1;i<=exponent;i++){
result*=base;
}
return result;
}
}
- 以上代码能够正确的解题目,但不完美。
- 可以再继续优化:
- PowerWithUnsignedExponent函数需要完成exponent-1 次的乘数运算,可以通弄过程序优化更进一步
public class Solution {
boolean flag = false;
public double Power(double base, int exponent) {
if(base==0.0 && exponent<0){
flag=true;
return 0.0;
}
int absExponent =exponent;
if(exponent<0){
absExponent=-exponent;
}
double result = PowerWithUnsignedExponent(base,absExponent);
if(exponent<0){
result = 1.0/result;
return result;
}
return result;
}
public double PowerWithUnsignedExponent(double base, int exponent){
//double result=1.0;
if(exponent==0)
return 1.0;
if(exponent==1)
return base;
double result = PowerWithUnsignedExponent(base,exponent >> 1);
result*=result;
if((exponent&0x01)==1){
result*=base;
}
return result;
}
}