第一种写法:递归形式、二分思想
class Solution {
public:
double myPow(double x, int n) {
if(n == 0) return 1;
if(n == 1) return x;
if(n == -1) return 1/x;
if(n % 2 == 0) {
double t = myPow(x, n/2);
return t * t;
}
else {
double t = myPow(x, n/2);
if(n < 0) x = 1/x;
return t * t * x;
}
}
};
第二种写法:更容易理解,二进制幂连乘的思想
class Solution {
public:
double myPow(double x, int n) {
double res = 1.0;
int tmp = n;
while(n) {
if(n & 1) res *= x; //二进制的思想,哪一位二进制为1,就乘上对应的x的次幂
x *= x; //x <= x^2
//n = n >> 1; //这样n为-2时右移会造成超时。。
n /= 2;
}
return tmp < 0 ? 1/res : res;
}
};
第三种:我自己最原始的写法,一直有bug,将右移改为整除就好了
class Solution {
public:
double myPow(double x, int n) {
if(abs(x-0) < 0.00001)
return 0;
if(n < 0) {
//return myPow(1/x, -n);
long int n = -n;
x = 1/x;
}
double res = 1.0;
while(n) {
if(n & 1)
res *= x;
x *= x;
//此处 把n = n >> 1改为除法,就可以双100%AC,否则会超时间限制
n /= 2;
}
return res;
}
};