题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方;
思路:
1、首先要分情况讨论。求x^y时,x的大于0,等于0,小于0三种情况;y的大于0,等于0,小于0的三种情况。
其中当x=0,y<0时返回false,因为分母不能为0;
2、考虑好上面的情况后,求值。
方法一:循环求乘积。
方法一代码:
public double Power(double base, int exponent) {
double sum=1;
if(exponent==0)
return 1.0;
for(int i=1;i<=Math.abs(exponent);i++){
sum*=base;
}
if(exponent>0){
return sum;
}else{
return 1/sum;
}
}
方法二(优化方案): 假设现在exponent=32;
- 当我们要求一个数字的32次方,就是将16次方再乘16次方;16次方就是将8次方再乘8次方,以此类推......
- 我们自底向上求结果,就是先平方,再求4次方,再求16次方,以此类推;
- 由上可得下面的公式
这个公式就是类似于斐波那契数列。
public class Power2 {
static boolean g_InvalidInput=false;
public static double power(double base, int exponent) {
g_InvalidInput=false;
//非法值的判断
if(equal(base,0.0)&&exponent<0){
g_InvalidInput=true;
return 0.0;
}
int absExponent=exponent;
//如果指数小于0,则取其绝对值
if(exponent<0){
absExponent=-exponent;
}
double result=powerWithExponent(base,absExponent);
//如果指数小于0,对结果取倒数
if(exponent<0)
result=1.0/result;
return result;
}
public static double powerWithExponent(double base,int exponent){
if(exponent==0)
return 1;
if(exponent==1)
return base;
double result=powerWithExponent(base,exponent>>1);
result*=result;
if ((exponent&1)==1)
result*=base;
return result;
}
public static boolean equal(double num1,double num2){
//判断小数是否有误差的时候不可以直接用==
if((num1-num2 > -0.0000001)&&(num1-num2)<0.0000001)
return true;
else
return false;
}
public static void main(String [] args){
double base=-5.0;
int exponent=3;
double power= power(base,exponent);
System.out.println(power);
}
}
注意点:1、小数不能直接使用==来比较是否相等,因为存在误差,所以使用减法,当相减之后再0.000001范围内时,便认为是相等。
2、使用右移运算代替了除以2,用&运算符代替求余数判断奇偶数。效率会极大的提高。
细节决定Offer,加油!