面试题15:数值的整数次方
1 题目
实现函数double Power(double base, int exponent),求base的 exponent次方。
不得使用库函数,同时不需要考虑大数问题
2 思路
- 需要考虑到输入exponent 为负数的情况,可以先对指数求绝对值,算出次方的结果后再取倒数
- 当exponent 为负数时,base 不能为0.
- 0的0次方,在数学上没有意义,输出0或1都行
3 代码
bool invalidInput= false;
double Power(double base ,int exponent)
{
if(equal(base,0.0) && exponent<0)
invalidInput=true;
return 0.0;
unsigned int absExponent = (unsigned int)(exponent);
if(exponent<0)
absExponent = (unsigned int)(-exponent);
double result = PowerUnsignedExponent(base,absExponent);
if(exponent<0)
result = 1.0/result;
return result;
}
double PowerUnsignedExponent(double base ,unsigned int exponent)
{
double result = 1.0;
for(int i=0;i<exponent;i++)
{
result = result*base;
}
return result;
}
4 优化
在计算次方的时候,除了简单的遍历,我们可以使用递归的思想,如下公式,来减少计算量
可以使用右移运算符代替除以2,用位与运算符代替求余运算符(%)来判断一个数是奇数还是偶数。
double PowerUnsignedExponent(double base, int exponent){
if(n == 0)
return 1;
if(n == 1)
return base;
//递归
double result = PowerUnsignedExponent(base, n>>1);
//
result *= result;
//判断是奇数还是偶数
if((n & 0x1) == 1)
result *= base;
return result;
}