题目描述:实现函数double Power(double base,int exponent),求base 的exponent次方。不得使用库函数,同时不需要考虑大数问题。
分析,题目要求实现库函数pow(),由于不需要考虑大数问题,不必担心溢出,那么就需要对输入的各种情况进行分类处理。当输入base == 0 或 base == 1时它们的任意次方都等于其本身;当输入exponent < 0 时, = ;当exponent == 0时, = 1; 然后可以用快速幂求整数的次方。
代码:
bool g_InvalidInput = false; //全局变量,用来指示是否发生错误或异常
bool Equal(double a,double b){ //浮点数比较大小
if(std::fabs(a - b) < 0.000001)return true;
else return false;
}
double Power(double base,int exponent){
g_InvalidInput = false;
if(Equal(base,0.0) && exponent < 0){
g_InvalidInput = true;
return 0.0;
}
unsigned int absExponent = (unsigned int)(exponent);
if(exponent < 0){
absExponent = (unsigned int)(-exponent);
}
double result = PowerWithUnsignedExponent(base,absExponent);
if(exponent < 0) result = 1.0 / result; //如果exponent小于0,就取它的倒数
return result;
}
double PowerWithUnsignedExponent(double,unsigned exponent){ //快速幂
if(base == 0)return 0;
if(exponent == 0 || base == 1)return 1;
if(exponent == 1)return base;
double result = PowerWithUnsignedExponent(base,exponent >> 1); //先求出base的(1/2 exponent)次方
result *= result; //然后再平方求得base的exponent次方
if(exponent & 0x1 == 1){
result *= base; //如果exponent是奇数就再乘以一个base
}
return result;
}