题目:实现函数 double power( double base, int exponent ),求 base 的 exponent 次方。不得使用库函数,同时不需要考虑大数问题
全面但不够高效的解法:
bool g_InvalidInput = false; // 全局变量,指示函数入参是否合理
const double EPS = 1e-6; // 判断double相等的辅助精度
bool equal( double a, double b ) // 判断两个double类型的数值是否相等
{
if( -EPS < a - b && a - b < EPS )
return true;
else
return false;
}
double powerWithUnsignedExponent( double base, unsigned int exponent ) // 指数 >= 0 的 power
{
double result = 1.0;
while( exponent-- > 0 )
{
result *= base;
}
return result;
}
double power( double base, int exponent )
{
double result = 1.0;
if( equal( 0.0, base) && 0 == exponent )
{
result = 0.0; // 零的零次方在数学上是没有意义的,与面试官讨论返回 0 或者 1;
return result;
}
else if( equal( 0.0, base ) && exponent < 0 )
{
g_InvalidInput = true; // 参数异常,0 的负数次方不存在
result = 0.0;
return result;
}
unsigned int absExponent = ( unsigned int )exponent;
if( exponent < 0 )
absExponent = ( unsigned int ) ( -1 * exponent );
result = powerWithUnsignedExponent( base, absExponent );
if( exponent < 0 )
result = 1.0 / result;
return result;
}
全面高效的解法( 修改 powerWithUnsignedExponent ):
double powerWithUnsignedExponent( double base, unsigned int exponent )
{
if( 0 == exponent )
{
return 1.0;
}
else if( 1 == exponent )
{
return base;
}
double result = powerWithUnsignedExponent( base, exponent >> 1 );
result *= result;
if( 0x1 == 0x1 & exponent )
result *= base;
return result;
}