问题描述:
Implement pow(x, n).自己写函数实现乘方运算
解题思路:
直接实现肯定超时,并且要考虑指数为0,指数为1,指数为负,底数为0的特殊情况,此题用递归方法实现,
以下代码来自《剑指offer》,此代码写的太赞了,如果想详细了解解题思路请买书!!刚看完所以直接贴上去运行了,必然轻松A过,向大神致敬!!!
bool g_InvalidInput = false;
bool equal(double num1, double num2);
double PowerWithUnsignedExponent(double base, unsigned int exponent);
class Solution
{
public:
double pow(double base, int exponent)
{
g_InvalidInput = false;
if(equal(base, 0.0) && exponent < 0)//默认一定范围外的数约等于0
{
g_InvalidInput = true;
return 0.0;
}
unsigned int absExponent = (unsigned int)(exponent);
if(exponent < 0)//指数小于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)
{
if(exponent == 0)
return 1;
if(exponent == 1)
return base;
double result = PowerWithUnsignedExponent(base, exponent >> 1);//此处exponent做的是移位运算,比直接除2快的多,大神!!!
result *= result;
if((exponent & 0x1) == 1)
result *= base;
return result;
}
bool equal(double num1, double num2)
{
if((num1 - num2 > -0.0000001)
&& (num1 - num2 < 0.0000001))
return true;
else
return false;
}
};