剑指offer—数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
博客中代码均在牛客C++11(clang++ 3.9)中通过
这道题实际上是对C库中pow函数的模拟实现,第一眼可能会觉得这道题很简单,但要注意,我们需要考虑指数不是正数的情况
0的0次方一般来说是没有意义的,但在高等数学中它的正向收敛趋近于1,这里姑且就按照1来处理
0的负数次方是非法的,因为负数次方相当于取其绝对值次方的倒数,而0是不可以作为分母的。我们可以通过返回值、全局变量和异常来反馈这种情况,这里使用全局变量
一般情况下我们可能会通过exponent-1次的循环来求解,其实我们可以换一种思路:比如要求16次方,可以先求8次方,求8次方先求4次方……这样我们就可以少做很多次乘法,这里通过递归的方式,每一次将exponent向右移位,而对于exponent是奇数的递归层里需要再乘一次底数base
代码如下:
bool InvalidInput = false;
class Solution {
public:
double Power(double base, int exponent) {
if(0.0 == base && exponent<0)
{
InvalidInput = true;
return 0.0;
}
unsigned int x = (unsigned int)exponent;
if(exponent<0)
x = (unsigned int)(-exponent);
double ret = Power1(base,x);
if(exponent<0)
ret = 1.0/ret;
return ret;
}
private:
double Power1(double base, int exponent)
{
if(0 == exponent)
return 1;
if(1 == exponent)
return base;
double ret = Power1(base,exponent>>1);
ret *= ret;
if(1 == (exponent&0x1)) //这里注意按位与运算的优先级比==低,所以加括号
ret *= base;
return ret;
}
};