问题要求
实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要靠考虑大数问题。
问题分析
看到这个问题,我觉得我跟大多数人想的是一样,直接循环作乘法。但是仔细一想,考虑的还是太少了。从底数和指数两方面分别考虑:
有这么几种情况我们不容忽视,1)对0求倒数出现异常,要做特殊处理;2)0的0次方是没有任何意义的,需要做特殊处理;3)复次幂即将指数求绝对值,然后再将最后的结果取倒数即可。
仔细阅读题目就会发现,题目要求底数类型是double型的,那么在判断底数是不是等于0时,不能直接判断base == 0.(计算机在表示小数时都有误差)。判断两个小数是否相等,只能判断它们之差的绝对值是不是在一个很小的范围中。所以将该判断方法封装成一个函数即可 bool equal(double x,double y);
代码如下:
//全局变量用来标识出错是因为底数为0且指数为负数的情况
bool InvaildeInput = false;
//判断两个小数是否相等
bool equal(double x,double y)
{
if ((x - y > -0.0000001) && (x - y < 0.0000001))
return true;
else
return false;
}
//计算指数为正整数时的整数次方
double PowerUnsignedExponent(double base,unsigned int exponent)
{
double result = 1.0;
for(unsigned int i = 1; i <= exponent; i++)
{
result *= base;
}
return result;
}
double Power(double base,int exponent)
{
InvaildeInput = false;
if (equal(base,0.0) && exponent < 0)
{
InvaildeInput = true;
return 0.0;
}
unsigned int UnsignedExponent = (unsigned int)exponent;
if (exponent < 0)
{
UnsignedExponent = (unsigned int)(-exponent);
}
double result = PowerUnsignedExponent(base,UnsignedExponent);
if (exponent < 0)
{
result = 1.0 / result;
}
return result;
}
问题总结
在此基础上,还有使用位运算来优化该算法的方法。这里并没有讨论,还是想说要多思考,多写。