实现函数 double Power(double base, int exponent),求base的exponent次方。
注意:
1.保证base和exponent不同时为0。
2.不得使用库函数,同时不需要考虑大数问题
3.有特殊判题,不用考虑小数点后面0的位数。
方法一:老传统,先暴力来一波(可惜时间太长
class Solution {
public:
double Power(double b, int n) {
if (n < 0) {
b = 1 / b;
n = -n;
}
double ret = 1.0;
for (int i=0; i<n; ++i) ret *= b;
return ret;
}
};
方法二:递归(注意n为偶数时ret*ret,当n为奇数时,ret*ret*b,用与符判断奇偶,n&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; //需要注意一下,如果是-2的32次方int会溢出,int的上限是2的32次方-1 。可用long
}
double ret = q_power(b,n);
return ret;
}
};
方法三:非递归快速幂,C++STL的power就是这么做的,挺巧妙地
class Solution {
public:
double Power(double b, int n) {
if (n < 0) {
b = 1 / b;
n = -n;
}
double x = b;
double ret = 1.0;
while(n){
if(n&1){
ret = ret *x;
}
x = x*x;
n = n >> 1;
}
return ret;
}
};
关键: n&1,判断当前二进制最低位是否为1,若是为1就乘。
n = n>>1,把n的二进制数向右移动一位。