leetcode50.Pow(x,n)

Posted by serrini on October 20, 2021

Question

//实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。 
//
// 
//
// 示例 1: 
//
// 
//输入:x = 2.00000, n = 10
//输出:1024.00000
// 
//
// 示例 2: 
//
// 
//输入:x = 2.10000, n = 3
//输出:9.26100
// 
//
// 示例 3: 
//
// 
//输入:x = 2.00000, n = -2
//输出:0.25000
//解释:2-2 = 1/22 = 1/4 = 0.25
// 
//
// 
//
// 提示: 
//
// 
// -100.0 < x < 100.0 
// -231 <= n <= 231-1 
// -104 <= xn <= 104 
// 
// Related Topics 递归 数学 
// 👍 763 👎 0

Answer

$x^n\,:\,3^5\,:\,x=3, \,n=5$

  1. n二进制表示0101,n«1表示n*=2,n»1表示n/=2。
  2. n&1==1表示最后一位是1,n&1==0表示最后一位是0。
  3. 对n做右移一位操作,n最后一位是1即做ret与x累乘。

$n=5=2^2+2^0$

x=3,n=5 n=0101 ret=1*3=3 x=3*3=9
  n=0010   x=9*9=81
  n=0001 ret=3*81=243 x=81*81=6561
  n=0001    
  n=0000    
  return    
x=2,n=10 n=1010   x=2*2=4
  n=0101 ret=1*4=4 x=4*4=16
  n=0010   x=16*16=256
  n=0001 ret=4*256=1024 x=256*256
  n=0000    
  return    
double myPow(double x, int n) {
    // x:2, n:10 (1010)
    //n<<1,*2; n>>1,/2
		double ret = 1;
    if (n<0) {
        x = 1/x;
    }
    long long k = abs((long long)n);	//防止超时

    while (k) {
        if (k&1) {
            //n的最后一位是1
            ret *= x;
        }
        x *= x;
        k = k>>1;
        cout << "x:" << x << endl;
    }

    return ret;
}
  1. x = 1.00000, n = -2147483648,long long存n,防止溢出
  2. x = 2.00000, n = -2