Pow and Sqrt

50.Pow(x, n)

解法一: 求x的幂,可以将它的指数转换成二进制的形式,把n看成是以2为基底构成的,对x求幂,迭代知道n取到最高位。

$$ 3^{11} = 3^{1 + 2 + 8} = 3^1 3^2 3 ^8 $$

上述求幂的过程是,判断最高位是不是1,如果是那么res = res,res= x;

double myPow(double x, int n){
  bool negative = n < 0?true:false;

  n = abs(n);
  double res = 1;
  for(int i = 31; i >= 0; i--){
    res *= res;
    if(n>>i & 1)
      res *= x;
  }
  return nagative?1/res:res;
}

感觉这个方法不太对,因为像(-2.0, INT_MIN)这样的情况并没有考虑到。 经过测试,发现abs(INT_MIN) = INT_MIN,并没有得到想要的2147483648,因为int表示不了这个值。同时,上面的解法没有考虑到底数是0的情况。

递归的版本

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

完整的版本

#include <iostream>
#include <limits.h>

using namespace std;

bool invalidInput = false;

//判断两个浮点数是否相等
bool equal(double num1,double num2){
        return ((num1 - num2 > -0.000001) && (num1-num2 < 0.0000001));
}

//也可以用递归来求解power
double power(double x, unsigned int p){
    double res = 1.0;

    for(int i = 31; i >= 0; i--){
        res *= res;
        if((p>>i) & 1)
            res *= x;
    }
    return res;
}

double power2(double x, unsigned int p){
  if(p == 0)
    return 1;
   double res = power(x, p/2);

   return (p&1)?res*res*x:res*res;
}
double myPower(double base, int exponent){
    invalidInput = false;

    if(equal(base, 0.0) && exponent <= 0){
        invalidInput = true;
        return 0.0;
    }

    unsigned int absExponent = (unsigned int)(exponent);
    if(exponent < 0)
        absExponent = (unsigned int)(-exponent);

    double result = power(base, absExponent);

    if(exponent < 0)
        result = 1.0/result;
    return result;
}

int main(){
    double b = 0.0;
    int p = 0;

    cout<<myPower(b, p)<<endl;
    return 0;
}

results matching ""

    No results matching ""