50. Pow(x, n)
Difficulty: Medium
Implement .
Example 1:
1 | **Input:** 2.00000, 10 |
Example 2:
1 | **Input:** 2.10000, 3 |
Solution
超时1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29class Solution {
public double myPow(double x, int n) {
double result=1.0;
if(n==0)return 1.0;
int l = Math.abs(n);
// n = 2^a+b
int a=0,b=0;
int i=1;
result = x;
while(i*2<l){
i*=2;
a++;
result *= result;
}
b = l-i;
while(b-->0){
result *=x;
}
if(n<0){
return 1/result;
}
return result;
}
}
网上的解法
1 | double myPow(double x, int n) { |
double myPow1
2
3
4
5
6double myPow(double x, int n) {
if(n==0) return 1;
double t = myPow(x,n/2);
if(n%2) return n<0 ? 1/x*t*t : x*t*t;
else return t*t;
}
double x1
2
3
4
5
6
7
8double myPow(double x, int n) {
if(n==0) return 1;
if(n<0){
n = -n;
x = 1/x;
}
return n%2==0 ? myPow(x*x, n/2) : x*myPow(x*x, n/2);
}
iterative one1
2
3
4
5
6
7
8
9
10
11
12
13
14double myPow(double x, int n) {
if(n==0) return 1;
if(n<0) {
n = -n;
x = 1/x;
}
double ans = 1;
while(n>0){
if(n&1) ans *= x;
x *= x;
n >>= 1;
}
return ans;
}
bit operation1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21class Solution {
public:
double pow(double x, int n) {
if(n<0){
x = 1.0/x;
n = -n;
}
int unsigned m = n;
double tbl[32] = {0};
double result = 1;
tbl[0] = x;
for(int i=1;i<32;i++){
tbl[i] = tbl[i-1]*tbl[i-1];
}
for(int i=0;i<32;i++){
if( m & (0x1<<i) )
result *= tbl[i];
}
return result;
}
};