1、题目:
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
2、考虑最简单的解法
double Power(double base, int exponent)
{
double result=1.0;
for(int i=0; i<=exponent; i++)
result*=base;
return result;
}
缺点:没有考虑输入的指数exponent小于1即是零和负数的情况。
3、全面但不够高效的解法
//判断两个浮点数是否相同
bool equal(double d1, double d2)
{
if((d1-d2<0.00000001)&&(d1-d2>-0.00000001))
return true;
else
return false;
}
//求无符号整数的次方
double PowerWithUnisgnedInt(double base, unsigned int exponent)
{
double result=1.0;
for(int i=1;i<exponentl i++)
{
result*=base;
}
return result;
}
double Power(double base, int exponent)
{
double result=1.0;
//对base为0,指数是负数的情况
if(equal(base,0.0)&&exponent<0)
{
cout<<"error!"<<endl;
return 0.0;
}
unsigned int absExponent=(unsigned int)exponent;
if(exponent<0)
absExponent=(unsigned int)(-exponent);
result=PowerWithunsignedInt(base,absExponent);
if(exponent<0)
return 1.0/result;
return result;
}
3、追求效率的解法
针对n次方,我们可以考虑用如下的公式来求:
可以通过优化double PowerWithUnisgnedInt(double base, unsigned int exponent)达到对效率的进一步优化。
double PowerWithUnisgnedInt(double base, unsigned int exponent)
{
double result=1.0;
if(exponent == 0)
return 1;
if(exponent == 1)
return base;
result=PowerWithUnsignedInt(base,exponent>>1);
result*=result;
if(exponent&OX1 ==1)
result*=base;
return result;
}
在优化方法中,我们使用了右移运算符代替了除以2,用位运算符代替了求余运算符来判断一个数是奇数还是偶数。因为位运算效率比乘数法及求余运算的效率高很多。