面试题11:数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
要全面考虑问题,指数可能有三种情况,正数、零、负数,底数也可能为0;
所以 当底数为0,指数为负数时,此情况要返回一个值,这是出错的
而且还要考虑的零的0次幂是没有意义的,要跟面试官说明。
class Solution {
public:
double Power(double base, int exponent) {
if(equal(base,0.0) && exponent<0)//底数为0,指数为负,返回0
{
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;
}
double PowerWithUnsignedExponent(double base,int exponent)
{
/*该方法的时间复杂度为O(n)
double result=1.0;
for(int i=1;i<=exponent;++i)
result* =base;
*/
//该方法的时间复杂度为O(logn)
if(exponent==0)
return 1.0;
if(exponent==1)
return base;
double result=PowerWithUnsignedExponent(base,exponent>>1);//右移1位实现除法,效率高
result=result*result;
if((exponent & 0x1)==1)//同理,用与的位运算实现求余%2运算,效率高
result *=base;
return result;
}
bool equal(double num1,double num2)//
{
if((num1-num2<0.0000001) && (num1-num2>-0.0000001))
return true;
else
return false;
}
};