面试题16:数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
思路和代码
题目看似很简单,其实事实上也很简单,但是细节需要考虑到。
首先判断输入base和exponent是否合理,然后判断指数是否小于0,如果小于0,则应该求出绝对值,最后的结果还要取倒数。
在计算正数的次方时,可以利用a^n = a(n/2)*a(n/2)。
class Solution {
private:
bool g_InvalidInput = false;
double PowerWith(double base, unsigned int exponent){
if(exponent == 0)
return 1;
if(exponent == 1)
return base;
double result = PowerWith(base, exponent >> 1);
result *= result;
//如果是奇数,还要再乘一个base
if(exponent & 0x1 == 1)
result *= base;
return result;
}
public:
double Power(double base, int exponent) {
g_InvalidInput = false;
if(base == 0.0 && exponent < 0){
g_InvalidInput = true;
return 0.0;
}
unsigned int absExponent = (unsigned int)(exponent);
if(exponent < 0)
absExponent = (unsigned int)(-exponent);
double result = PowerWith(base, absExponent);
if(exponent < 0)
result = 1.0 / result;
return result;
}
};