1、题目描述
实现函数double Power(double base,int exponent),求base 的exponent次方。不得使用库函数,同时不需要考虑大数问题。
2、解题思路
做本道题目,需要考虑以下几种问题:
当指数为负数时: 先对指数求绝对值,然后在计算出次方的结果之后再取倒数;
当対0求倒数时: 当底数是0且指数是负数的时候,就会出现对0求倒数从而导致程序运行出错;
0的0次方在数学上是没有意义的:
3、解决方法一
//全局变量,标记是否出现对0求倒数的错误
bool flag = false;
//判断两个double数据是否相等
bool equal(double num1,double num2){
if((num1-num2 > -0.0000001) && (num1-num2 < 0.0000001))
return true;
else
return false;
}
double PowerWithUnsignedExponent(double base,unsigned int exponent){
double result = 1.0;
for(int i=0;i<=exponent;++i){
result *= base;
}
return result;
}
double Power(double base,int exponent){
flag = false;
//当底数是0且指数是负数的时候,就会出现对0求倒数从而导致程序运行出错
if(equal(base,0.0) && exponent < 0){
flag=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;
return result;
}
4、解决方法二—-更高效
假如求一个数字的32次方,如果已经知道了它的十六次方,则只需要在16次方的基础上再平方一次就可以了。二6次方是8次方的平方,以此类推;
也就是说,可以直接使用以下总结出来的数学公式直接求解:
double PowerWithUnsignedExponent(double base,unsigned int exponent){
if(exponent == 0)
return 1;
if(exponent == 1)
return base;
double result = PowerWithUnsignedExponent(base,exponent >> 1);
result *= base;
if(exponent & 0x1 == 1)
result *= base;
return result;
}