文章目录
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
示例:
输入
2,3
返回值
8.00000
解答思路
- 检查底数是否为0,如果底数为0,无论指数多少,算式是无意义的!!!
- 当exponent为0时,任何数0次方为1,直接返回1;
- 判断exponent是否小于0,如果小于0,通过标志位flag记录,将exponent转化成正数
- 循环计算正数次方下的底数次幂。
- 当标志位flag < 0时,将res取倒数。
注意:不要分别在exponent大于0,小于0条件下分别计算base的abs(exponent)次方,这样出现重复计算,使复杂度增加
代码实现:
class Solution {
public:
double Power(double base, int exponent) {
if(fabs(base - 0.0) < 1e-15){
cout << "底数是0无意义" << endl;
return 0.0;
}
double res = 1.0, flag = 1.0;
if(exponent == 0) return res;
else if(exponent < 0){
flag = -1.0;
exponent = fabs(exponent);
}
for(int i = 1; i <= exponent; ++i){
res *= base;
}
return flag > 0 ? res : 1.0 / res;
}
};
快速幂
使用递归,时间复杂度O(logn)
- 当n为偶数,an = an/2 * an/2
- 当n为奇数,an = a(n-1)/2 * a(n-1)/2 *a
class Solution {
public:
double Power(double base, int exponent) {
if(fabs(base - 0.0) < 1e-15){
cout << "底数是0无意义" << endl;
return 0.0;
}
double res = 1.0, flag = 1.0;
if(exponent == 0) return res;
else if(exponent < 0){
flag = -1.0;
exponent = fabs(exponent);
}
// else if(exponent == 1) return base;
// res *= Power(base, exponent>>1);
// res *= res;
// if(exponent & 0x1) res *= base;
// 也可以用递归做,这里采用了循环
while (exponent) {
if (exponent & 0x1) res *= base;
base *= base;
exponent >>= 1;
}
return flag > 0 ? res : 1.0 / res;
}
};