题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
【思路】
表面看没什么难度,但是需要注意,如果指数为负 ,可以先对指数求绝对值,算出结果后再求倒数,那么问题来了,如果此时底数是0求倒数就有问题了。因此首先需要把这种情况排除:
if(base == 0.0 && exponent < 0)//防止0做分母
return 0.0;
我们写一个PowerWithExponent函数来处理次方运算的部分:
double PowerWithExponent(double base, int exponent){
if(exponent == 0)
return 1.0;
if(exponent == 1)
return base;
double res = PowerWithExponent(base,exponent >> 1);
res = res * res;
if(exponent & 0x1 == 1)
res *= base;
return res;
}
上面做了效率优化,直接用移位操作代替除以2,用位与运算符代替了求余运算符来判断一个数是奇数还是偶数。奇数的话需要多乘一个base。
以下是完整代码:
class Solution {
public:
double Power(double base, int exponent) {
if(base == 0.0 && exponent < 0)//防止0做分母
return 0.0;
return exponent < 0 ? 1.0/PowerWithExponent(base,0-exponent) : PowerWithExponent(base,exponent);
}
double PowerWithExponent(double base, int exponent){
if(exponent == 0)
return 1.0;
if(exponent == 1)
return base;
double res = PowerWithExponent(base,exponent >> 1);
res = res * res;
if(exponent & 0x1 == 1)
res *= base;
return res;
}
};