题目:
实现函数double Power(double base,int exponent),
求 base 的 exponent 次方。不得使用库函数,同时不需要考虑大数问题。
分析:
1.当指数为正数时,正常求解
2.当指数为负数时,先按-exponent来求,
最后的到的结果进行求倒数。
3.当指数为0时,返回1
4.当底数为0时,并且指数为负数,那么对0求倒数就会出现程序错误,这里直接将此情况返回0.
5.求平方时,为了提高效率,可以先判断指数是奇数还是偶数,如果是偶数,比如要求32次方,那么就可以先求他的16次方,然后再在16次方的基础上进行平方,而16次方是8次方的平方,以此类推。当exponent为奇数时,最后还要再乘一次底数。
在进行乘除时,最好使用位运算,效率高,同理,求一个数的奇偶性,可以通过将此数与1进行与运算,如果为1,那么就是奇数。
static boolean g_InvalidInput=false;//用来记录是出错的时候返回0,还是底数为0的时候正常运行返回零。
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while (sc.hasNext()){
double base=sc.nextDouble();
int exponent=sc.nextInt();
System.out.println(Power(base,exponent));
}
}
/**
* 要考虑的因素:
* 1.base为0 返回零
* 2.exponent=0 返回1
* 3.exponent>0 正常求解
* 4.exponent<0 求-exponent 再求倒数
*/
static double Power(double base,int exponent){
g_InvalidInput=false;
/**
* 当底数为0,并且指数是负数的时候,如果不进行特殊处理,就会出现对0求倒数
* 从而导致程序运行出错。
*/
if(base==0.0&& exponent<0){
g_InvalidInput=true;//程序运行出错,返回0
return 0;
}
double result=1.0;
if(exponent<0){
result=1.0/PowerWithUnsignedExponent(base,-exponent);
}else {
result=PowerWithUnsignedExponent(base,exponent);
}
return result;
}
static double PowerWithUnsignedExponent(double base,int exponent){
if(exponent==0) //由于0的0次方没有意义,这里就直接把0的0次方也输出为1
return 1;
if(exponent==1)
return base;
double result=PowerWithUnsignedExponent(base,exponent>>1);//右移,除以2
result*=result;
if((exponent&1)==1)//如果exponent是奇数
result*=base;
return result;
}