题目:实现函数double power( double base, int exponent),求base的exponent次方。不得使用库函数,同时需要考虑大数问题。
大体思路很简单啊,就是base做exponent次相乘就好了。但是我们需要全面,比如base为0,指数为复数,这些情况怎么处理。数学上,0的0次是没有意义的,我们这儿返回0。当指数为负数的时候,可以先求base的 |exponent| 次幂,然后取到数。
上述思路的Java代码实现如下:
static double power(double base , int exp){
if(base==0)
return 0;
int absExp=Math.abs(exp);
double result=powerWithUnsignedExp(base,absExp);
if(exp<0){
result=1.0/result;
}
return result;
}
方法中,用了powerWithUnsignedExp(double base, int absExp),这是用来计算一个数的正整数次幂的方法,实现如下:
private static double powerWithUnsignedExp(double base, int absExp) {
double result=1;
for(int i=1;i<=absExp;i++){
result*=base;
}
return result;
}
利用幂次运算的规则,a^n=a^n/2*a^n/2,n为奇数是先提一个a出来,就转成偶数一样了。还可以减少计算次数,可以修改powerWithUnsignedExp(double base, int absExp)如下:
private static double powerWithUnsignedExp2(double base,int absExp){
if(absExp==0)
return 1;
if(absExp==1)
return base;
double result=powerWithUnsignedExp(base, absExp>>1);
result*=result;
if((absExp&0x1)==1)
result*=base;
return result;
}
代码中用移位运算(absExp>>1)代替除法,提高效率。
测试代码如下:
public static void main(String[] args) {
double[] baseArr={-2,0,2};
int[] expArr={-2,0,2};
for(int i=0;i<baseArr.length;i++){
for(int j=0;j<expArr.length;j++){
System.out.print(power(baseArr[i], expArr[j]));
System.out.print(", ");
}
}
}
输出如下:
0.25, 1.0, 4.0, 0.0, 0.0, 0.0, 0.25, 1.0, 4.0,
改变pow方法中的powerWithUnsignedExp 实现方式,得到结果一致。