Pow(x, n)
Implement pow(x, n).
这题主要考察分治法,这样效率就可达到O(logn)
需要注意的是:n>0时 n为偶数时 xn = xn/2 * xn/2,n为奇数时 xn = x(n-1)/2 * x(n-1)/2 * x
n=0时 ,xn = 1
n<0时 xn = 1 / x-n
代码如下:
1 class Solution { 2 public: 3 double pow(double x, int n) { 4 if( n == 0 ) return 1.0; 5 bool minus = false; 6 if( n < 0 ) { //记录n是否为负数 7 n = -n; 8 minus = true; 9 } 10 double s = 0; 11 if( n&1 ) { //奇数 12 s = pow(x, (n-1)/2); 13 s = x * s * s; 14 } 15 else { //偶数 16 s = pow(x, n/2); 17 s *= s; 18 } 19 return minus ? (1.0/s) : s; 20 } 21 };
继续对代码进行优化:
1 class Solution { 2 public: 3 double pow(double x, int n) { 4 if( n == 0 ) return 1.0; 5 if( n == 1 ) return x; 6 bool minus = false; 7 if( n < 0 ) { //记录n是否为负数 8 n = -n; 9 minus = true; 10 } 11 double s = 0; 12 s = pow( x, n>>1 ); //求x的n/2次方 13 s *= s; 14 if( n&1 ) s*=x; //如果n为奇数,那么需要乘上x 15 return minus ? (1.0/s) : s; 16 } 17 };
class Solution { public: double myPow(double x, int n) { if (n == 0) { return 1.0; } bool minus = false; long long ln = n; if (ln < 0) { minus = true; ln = -ln; } double t = myPow(x, ln / 2); t *= t; if (ln & 1) { t *= x; } return minus ? 1 / t : t; } };