题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思想:
1、指数为负数,对指数求绝对值,计算次方结果之后取倒数
2、取倒数时,考虑到对0取倒数?针对底数base为零,且指数exponent是负数情况特殊处理
3、采用全局变量标识这种错误情况;有返回值、全局变量、异常三种错误处理方式
4、在判断底数base是不是等于0时,不能直接写base==0?
对于float和double 型小数,判断两个小数是否相等,只能判断它们之差的绝对值是不是在一个很小的范围内,比如[-0.0000001,0.0000001]
5、求一个数字的整数次方,比如求32次方,采用公式法,用递归实现,复杂度o(logn)
class Solution {
public:
bool g_InvalidInput=false;//定义全局变量标识是否出错
double Power(double base, int exponent)
{
g_InvalidInput=false;
//判断底数为0,指数为负数情况
if(equal(base,0.0)&&exponent<0)//判断double类型是否等于0.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;
return result;
}
//计算base的exponent次方,不够高效
/* double powerWithUnsignedExponent(double base,unsigned int exponent)
{
double result=1.0;
for(int i=1;i<=exponent;i++)
result*=base;
return result;
}*/
//根据公式计算base的exponent次方,更高效
double powerWithUnsignedExponent(double base,unsigned int exponent)
{
if(exponent==0)
return 1;
if(exponent==1)
return base;
double result=powerWithUnsignedExponent(base,exponent>>1);//右移运算符代替除以2
result*=result;//2^16*2^16
if(exponent&0x1==1)//用位与运算符代替求余判断奇偶,效率高,如果为奇数
result*=base;
return result;
}
//判断两个小数是否相等,只能判断它们只差是不是在一个很小的范围内
bool equal(double num1,double num2)
{
if((num1-num2>-0.0000001)&&(num1-num2<0.0000001))
return true;
else
return false;
}
};