面试题16:数值的整数次方
题目:
实现函数double Power(double base,int exponent)
,求base
的exponent
次方。不得使用库函数,同时不需要考虑大数问题。
思路:
要权全面考虑输入的所有情况,输入的指数可能大于1,小于1或者是零和负数。
代码:
bool g_InvalidInput=false;
double Power(double base,int exponent){
g_InvalidInput = false;
if(equal(base,0.0) && exponent<0){
g_InvalidInput = true;
return 0.0;
}
unsigned int absExponent = (unsigned int)(exponent);
if(exponent<0)
absExponent = (unsigned int)(-exponent);
double result = PowerWithUnsignedExponent(base,absExponent);
if(exponent<0)
result = 1.0/result;
return result;
}
double PowerWithUnsignedExponent(double base,unsigned int exponent){
double result=1.0;
for(int i=1;i<=exponent;i++)
result*=base;
return result;
}
这里最容易出错的地方就是没有考虑到输入的指数可能大于1,小于1或者是零和负数,从而做错这个题。
同时这个代码可以优化,比如求一个数的16次方,上面的做法是从1到16依次来做,但是在这个过成中已经产生了8次方,我只要把这个8次方的数在两两相乘就可以得到16次方,这里需要考虑奇偶性。
a
(
n
)
=
{
a
n
/
2
∗
a
n
/
2
,
n
为偶数
a
(
n
−
1
)
/
2
∗
a
(
n
−
1
)
/
2
∗
a
,
n
为奇数
a(n)=\left\{\begin{matrix} a^{n/2}*a^{n/2} ,n为偶数\\ a^{(n-1)/2}*a^{(n-1)/2}*a,n为奇数 \end{matrix}\right.
a(n)={an/2∗an/2,n为偶数a(n−1)/2∗a(n−1)/2∗a,n为奇数
代码如下:
double PowerWithUnsignedExponent(double base,unsigned int exponent){
if(exponent==0)
return 1;
if(exponent==1)
return base;
double result = PowerWithUnsignedExponent(base,exponent>>1);
result *= result;
if(exponent&0x1==1)
return result*=base;
return result;
}
考点:
- 考察对题目思考的全面性