题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
解题思路
库函数中有幂函数pow(x,y),如果你直接return pow(base,exponent);也能通过测试用例,但估计offer无缘了。
为了降低时间复杂度,使用迭代:
- 如果n为偶数,a^n=a^(n/2)*a(n/2);
- 如果n为奇数,a^n=a^(n/2)*a(n/2)*a;
- n/2可以用右移1位得到;
此外,本题还要考虑以下几点:
- exponent=0时,结果为1;
- base趋近于0时,结果为0;
- base趋近于1时,结果为1;
- base趋近于-1时,指数为奇数时结果为-1,指数为偶数时结果为1;
- exponent<0时,结果为(1/base)^(-exponent);
代码
class Solution {
public:
double Power(double base, int exponent) {
if (exponent == 0)
return 1.0;
if (fabs(base) < 1e-5)
return 0.0;
if (fabs(base - 1) < 1e-5)
return 1;
if (fabs(base + 1) < 1e-5)
return exponent % 2 ? -1 : 1;
if (exponent < 0){
base = 1.0 / base;
exponent = -exponent;
}
double res = 1.0;
while (exponent){
if (exponent % 2){
res *= base;
}
base *= base;
exponent >>= 1;
}
return res;
}
};