题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
解题思路
下面的讨论中 x 代表 base,n 代表 exponent。
因为 (x*x)^(n/2) 可以通过递归求解,并且每次递归 n 都减小一半,因此整个算法的时间复杂度为 O(logN)。
递归
class Solution {
public:
double Power(double base, int exponent) {
if(exponent > 0) {
if(exponent == 1) return base;
if(exponent%2 == 0) return Power(base, exponent>>1)*Power(base, exponent>>1);
else return Power(base, exponent>>1)*Power(base, (exponent>>1)+1);
}
else if(exponent == 0) {
if(base > 0.0 || base < 0.0) return 1.0;
else return 0.0; //抛出错误:三种方式
}
else {
if(base > 0.0 || base < 0.0) return 1/Power(base, 0-exponent);
else return 0.0; //抛出错误:三种方式
}
}
};
移位
class Solution {
public:
double Power(double base, int exponent) {
if(exponent == 0) {
if(base > 0.0 || base < 0.0) return 1.0;
else return 0.0; //抛出错误:三种方式
}
unsigned int p = abs(exponent);
double r = 1.0;
while(p) {
if(p&1) r *= base;
base *= base;
p >>=1;
}
return exponent>0 ? r : ((base > 0.0 || base < 0.0) ? 1/r : 0.0); //抛出错误
}
};