题目:实现函数double power(double base,int exponent)函数,求base的exponent次方,不得使用库函数,不用考虑大数问题。
一看题目很快可以写出如下的代码:
int Power(int base, int exp)
{
int result = 1;
for (int i = 0; i < exp; i++)
{
result *= base;
}
return result;
}
但是,这样简单粗暴的代码是不会有人欣赏的,至少得考虑一下特殊输入啊,如果exponent为负怎么办,如果base为0怎么办,如果base和exponent都为0怎么办?
考虑这些问题后,可以得到以下的代码:
bool g_InvalidInput = false;
double absExponentPower(double base, int exponent)
{
double result = 1.0;
for (int i = 0; i < exponent; i++)
{
result *= base;
}
return result;
}
bool equalcase(double num1, double num2)
{
if (num1 - num2 < 0.000000001 && num1 - num2 > -0.000000001)
return true;
else
return false;
}
double Power(double base, int exponent)
{
double result = 0.0;
g_InvalidInput = false;
if (equalcase(base, 0.0) && exponent < 0)
{
g_InvalidInput = true;
return 0.0;
}
unsigned int absExponent = (unsigned int)(exponent);
if (exponent < 0)
{
absExponent = unsigned(-exponent);
result = absExponentPower(base, absExponent);
result = 1.0 / result;
}
else
result = absExponentPower(base, exponent);
return result;
}
这样的代码比较靠谱了,但是算法导论公开课中提到的用二分法解决的话,会使得效率更佳提高。并且,除2用右移运算代替,求余用&运算代替,运算速度更上一层!估计这样写再也优化不了多少了。
double Power_bitCal(double base,unsigned int exponent)
{
if (exponent == 0)
return 1;
if (exponent == 1)
return base;
double result = Power_bitCal(base, exponent >> 1);
result = result*result;
if (exponent & 0x1 == 1)
result *= base;
return result;
}