剑指offer之数值的整数次方

来源:互联网 发布:知乎日本反战同盟 编辑:程序博客网 时间:2024/06/06 03:08

1.考虑到输入的指数是零或负数的情况。

2.当底数是零,指数是负数时,做特殊处理。三种出错处理方式:返回值,全局代码,异常

3.0的0次方

4.在判断底数是否为零时,由于计算机内表示小数时都有误差,如果两个数相差很小就可以认为这两个数相等。

public static boolean invalidInput = false;
public static double Power(double base,int exponent){
invalidInput = false;
if(equal(base,0.0)&&exponent<0){
invalidInput=true;
return 0.0;
}
double p1 = powerwithExponent(base,Math.abs(exponent));
if(exponent<0){
return 1.0/p1;
}else{
return p1;
}
}
public static double powerwithExponent(double n1,int n2){
double m=1.0;
for(int i=0;i<n2;i++){
m*=n1;
}
return m;
}
public static boolean equal(double num1,double num2){
if((num1-num2>-0.0000001)&&(num1-num2<0.0000001)){
return true;
}else{
return false;
}
}

更高效的方法,递归

用右移运算符代替除二,用位与运算符代替取余。

位运算的效率比乘除及取余效率要高很多。

//递归方法
public static double newPower(double base,int exponent){
if(exponent==0){
return 1;
}
if(exponent==1){
return base;
}
double result = newPower(base, exponent >> 1);
result*=result;
if((exponent&0x1)==1){
result*=base;
}
return result;
}






0 0
原创粉丝点击