题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
预处理:求pow(b, n),如果n为负数怎么解决?
假如求x的-2次方,是不是可以转换成(1/x)的2次方
于是,预处理代码如下:
double Power(double b, int n) {
if (n < 0) {
b = 1 / b;
n = -n;
}
}
方法一:暴力方法
很显然就是n个b相乘。循环n次
class Solution {
public:
double Power(double base, int exponent) {
if(exponent <0){
base = 1 / base;
exponent = -exponent;
}
double ret = 1.0;
for(int i=0; i<exponent; i++){
ret *= base;
}
return ret;
}
};
时间复杂度:O(n)
空间复杂度:O(1)
方法二:递归法(快速幂)
class Solution {
public:
double q_power(double b, int n) {
if (n == 0) return 1.0;
double ret = q_power(b, n/2);
if (n&1) { // 奇数
return ret * ret * b;
}
else {
return ret * ret;
}
}
double Power(double b, int n) {
if (n < 0) {
b = 1 / b;
n = -n;
}
return q_power(b, n);
}
};
方法三:非递归的快速幂
class Solution {
public:
double Power(double base, int exponent) {
if(exponent <0){
base = 1 / base;
exponent = -exponent;
}
double ret = 1.0;
while(exponent){
if(exponent&1){
ret *= base;
}
base *= base;
exponent = exponent >> 1;
}
return ret;
}
};