题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
分析:
1、首先要考虑基数base是否等于0,等于零时,其exponent次方是无意义的,所以等于零或者等于1都无所谓
2、考虑exponent的正负。当exponent为负时,最后结果要取倒数
3、当base==0,并且expinent为负数时,就是0作了除数,会出现错误,需要利用返回值或者全局变量或异常返回错误。
考虑到这些,代码可以写为:
class Solution {
public:
bool invalid=false;
double Power(double base, int exponent) {
if((base==0.0)&&exponent<0)
{
invalid=true;//利用invalid用以区分返回错误return0.0与真正的值返回0.0
return 0.0;//利用返回值进行错误处理。
}
unsigned int absexponent=(unsigned int )(exponent);
if(exponent<0)
unsigned int absexponent=(unsigned int )(-exponent);//因为题目要求不能使用库函数
double result=powerwithexponent(base,absexponent);
if(exponent<0)
result=1/result;
return result;
}
double powerwithexponent(double base,unsigned int exponent)
{
double result=1.0;
for(int i=1;i<=exponent;++i)
result*=base;
return result;
}
};
更高效的写法:
class Solution {
public:
bool invalid=false;
double Power(double base, int exponent) {
if((base==0)&&(exponent<0))
{
invalid=true;//利用invalid用以区分返回错误return0.0与真正的值返回0.0
return 0.0;//利用返回值进行错误处理。
}
int absexponent=abs(exponent);
double result=powerwithexponent(base,absexponent);
if(exponent<0)
result=1/result;
return result;
}
double powerwithexponent(double base,int exponent)
{
if(exponent==0)
return 1;
if(exponent==1)
return base;
//递归
double result=powerwithexponent(base,exponent>>1);//利用向右移位操作代替/2操作,提高效率
result*=result;
//判断奇偶性
if(exponent&0x1==1)//利用位&操作代替%运算,判断奇偶数
result*=base;
return result;
}
};