题目:实现函数double power(double base,int exp)求base的exp次方。不得使用库函数,同时不需要考虑大数问题。
分析:pow函数我们已经使用过很多次,对于其函数原型我们也很熟悉。
double pow( double x, double y );
很快我们就会写出如下的代码:
double MyPowerwithUnsigned(double base,int exp)
{
double result=1.0;
int i=0;
for(i=1; i<=exp; i++)
{
result*=base;
}
return result;
}
可是,如果我们输入的指数是负数或者是零将会无法正确计算。说明上述代码还是存在很大的漏洞。对于这个问题我们需要分三种情况考虑,第一,输入指数是正整数;第二,输入指数是0;第三,输入指数是负整数。这样处理就能轻松应对了。
Note:注意浮点数与零值作比较的正确方式。不能直接用判断相等进行判断,需要给予一个精度进行比较。例如:if(x>=-EPSINON && x<=EPSINON)(EPSINON是精度)。
参考源代码:
#include<cstdio>
#include<cstdlib>
bool flag=false;
double MyPowerwithUnsigned(double base,unsigned int exp)
{
double result=1.0;
int i=0;
for(i=1; i<=exp; i++)
{
result*=base;
}
return result;
}
bool equal(double num1,double num2)
{
if((num1-num2>-0.0000001 ) && (num1-num2<0.0000001))
{
return true;
}
else
{
return false;
}
}
double MyPower(double base,int exp)
{
flag=false;
if(equal(base,0.0) && exp < 0)
{
flag=true;
return 0.0;
}
unsigned int absexp=(unsigned int)exp;
if(exp<0)
unsigned int absexp=(unsigned int)(-exp);
double result=MyPowerwithUnsigned(base,absexp);
if(exp<0)
{
result=1.0/result;
}
return result;
}
int main()
{
double ret=MyPower(2.5,2);
printf("%lf\n",ret);
system("pause");
return 0;
}