Pow(x, n)

Implement pow(xn).

 

这题主要考察分治法,这样效率就可达到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;
    }
};

 

posted on 2014-09-07 22:27  bug睡的略爽  阅读(153)  评论(0编辑  收藏  举报

导航