数值的N次方
问题描述:
实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,
同时不需考虑大数问题。
思路分析:
要是你秒秒钟想到一个循环搞定估计面试没戏了。要考虑指数为0和负数的情况,如果底数也
为0了?为负数时就是相当于要求正数时的倒数,这是又要考虑分母为0.
参考代码:
bool g_inputInvalid = false;
double Power(double base,int exponnet)
{
g_inputInvalid = false;
if (Equal(base,0) && exponnet < 0)
{
g_inputInvalid = true;
return 0.0;
}
unsigned int abExponent = (unsigned int)(-exponnet);
if (abExponent < 0)
{
abExponent = -abExponent;
}
double result = PowerWithUnsignedExponent(base,abExponent);
if (exponnet < 0)
{
result = 1.0/result;
}
return result;
}
double PowerWithUnsignedExponent(double base,unsigned int exponnet)
{
if (exponnet == 0)
{
return 1;
}
if (exponnet == 1)
{
return base;
}
double result = PowerWithUnsignedExponent(base,exponnet>>1);//每次求出基数的偶数次方减少循环
result *=result;//用了一公式a^n = a^(n/2)*a^(n/2) 或者a^n = a^((n-1)/2)*a^((n-1)/2)*a
if (exponnet &0x1 == 1)//判断指数是偶数还是奇数,奇数要再乘一次底数
{
result *= base;
}
return result;
}
bool Equal(double nNum1,double nNum2)
{
if ((nNum1-nNum2 > -0.0000001) && (nNum1-nNum2 < 0.0000001))
{
return true;
}
else
{
return false;
}
}
思考:
一个细节得注意,在判断两个小数是否相等时不能直接用 == 去判断,因为在计算机内表示小数时都有误
差,所以只能判断它们的绝对值是不是在一个很小的范围内。