问题:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
输入:double型浮点数base,int型整数exponent。
输出:double型结果。
思路:本题思路不难,但是容易忘记处理各种边界值,异常值。
当exponent为正数时,base直接累乘exponent-1次,得到结果
异常值1:当exponent为负数时
处理方法:先取得exponent的绝对值,然后做累乘,得到中间结果,最后结果为1.0/中间结果。
异常值2:当base为0时,exponent为负数时,容易出现1/0.
处理方法:增加一个判断,抛出异常。
代码:
class Solution {
public:
double Power_Core(double base, unsigned int exponent)
{
double result=base;
for(unsigned int i=1;i<exponent;++i)
{
result=result*base;
}
return result;
}
double Power(double base, int exponent) {
double result;
if(abs(base-0.0)<0.0000001&&exponent<0)
return 0.0;
if(exponent==0)
return 1.0;
unsigned int absExponent = (unsigned int)(exponent);
if(exponent<0)
absExponent = (unsigned int)(-exponent);
result= Power_Core(base, absExponent);
if(exponent<0)
{
result=1.0/result;
}
return result;
}
};
复杂度分析:时间复杂度为O(exponent),空间复杂度为O(1)。
性能优化:通过优化Power_Core函数,将时间复杂度减小为 O(log exponent),空间复杂度不变。
double Power_Core(double base, unsigned int exponent)
{
if(exponent==1)
return base;
double result=Power_Core(base,exponent>>1);
result *= result;
if(exponent&0x1==1)
result*=base;
return result;
}