[leetcode]50. Pow(x, n)

[leetcode]50. Pow(x, n)_第1张图片

Code 1.0 暴力解法(超时)

class Solution {
public:
    double myPow(double x, int n) {
        
        double res = 1;
        
        if ( n > 0 ){
            while ( n > 0 ){
                res *= x;
                n--;
            }
        }else if ( n < 0 ){
            while ( n < 0 ){
                res /= x;
                n++;
            }
        }
        
        return res;
        
    }
};

Code 2.0 降幂解法(超时)

利用:xn = xn/2 *xn/2

class Solution {
public:
    double myPow(double x, int n) {
        
        double res = 1;
        int k = abs(n);
        int index = 0;
        while ( k > 0 && k % 2 == 0 ){
            index++;
            k /= 2;
        }
        if ( n > 0 ){
            while ( k > 0 ){
                res *= x;
                k--;
            }
            while ( index > 0 ){
                res *= res;
                index--;
            }
        }else if ( n < 0 ){
            while ( k > 0 ){
                res /= x;
                k--;
            }
            while ( index > 0 ){
                res *= res;
                index--;
            }
        }
        
        return res;
        
    }
};

Code 3.0 快速降幂解法(AC)

利用:

  1. xn = xn-k *xk
  2. x二进制是否为1,来表示每一位。

!注:abs整形数取绝对值;fabs浮点数取绝对值。

class Solution {
public:
    double myPow(double x, int n) {
        if ( n < 0 ){
            x = 1/x;
        }
        
        double index = x;
        double res = 1;
        
        for ( long long i = fabs(n) ; i != 0 ; i /= 2 ){
            if ( i%2 == 1 ){
                res *= index;
            }
            index = index*index;
        }
        
        return res;
    }
};

Submit

[leetcode]50. Pow(x, n)_第2张图片

你可能感兴趣的:(leetcode)