面试题16:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路:分情况考虑,base==0和base!=0,exponent>0和exponent<0。
当base==0,exponent<=0时,结果出错;
当base==0,exponent>0时,结果为0;
当base!=0,exponent>0时,结果按常规相乘exponent-1次就可得出;
当base!=0,exponent<0时,结果要在常规相乘的基础上取倒数。
于是我们可以写出以下代码:
double Power(double base, int exponent) {
if (base ==0 && exponent<=0 )
return 0;
int absExponent;
double result=0;
if (exponent>0){
result=PowerWithUnsignedExponent(base,exponent);
}
else{
absExponent=-exponent;
result=1/PowerWithUnsignedExponent(base,absExponent);
}
return result;
}
double powerWithUnsignedExponent(double base,int exponent)
{
double result=1.0;
for (int i=0;i<exponent;i++)
result*=base;
return result;
}
下面我们来谈论代码的优化,powerWithUnsignedExponent()函数在exponent取较大值的时候需要将result相乘很多次,我们可以用递归的方式来实现相乘次数更少的算法。
double PowerWithUnsignedExponent(double base,int exponent){
if (exponent==0)
return 1;
if (exponent==1)
return base;
double result=PowerWithUnsignedExponent(base,exponent>>1);
result*=result;
if (exponent&1)
result*=base;
return result;
}
还有两个细节:a>>1相当于a/2,a&1相当于a%2。位运算的效率比乘除法和求余运算高得多。