50. Pow(x, n)
Implement pow(x, n).
分析
该题目首先想到可以使用recursion去做,需要考虑一个陷阱,当 n 为 INT_MIN,反转会溢出
1 2 3 4 5 6 7 8 9 10 11  | class Solution {public:    double myPow(double x, int num) {        long n = num;        if(n == 0) return 1;        x = n > 0 ? x : 1.0/x;        n = n > 0 ? n : -n;        return n&1 ? x*myPow(x, n - 1) : myPow(x*x, n/2);             }}; | 
因为是tail recursion,所以可以改写成 while 循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16  | class Solution {public:    double myPow(double x, int num) {        long n = num;        if(n == 0) return 1;        x = n > 0 ? x : 1.0/x;        n = n > 0 ? n : -n;        double ans = 1;        while(n > 0){            if(n&1) ans*=x;            x*=x;            n/=2;        }        return ans;    }}; | 
可以保证 n 不溢出算法
1 2 3 4 5 6 7 8 9 10 11 12 13  | class Solution {public:    double myPow(double x, int n) {        if(n == 0) return 1;        double t = myPow(x, n/2);        if(n&1){//odd             return n > 0 ? x*t*t : 1.0/x * t * t;        }        else{//even            return t*t;        }    }}; | 
还有一种基于 位 操作的算法
我们现在求 xn,把 n 写成 32 bit的形式,比如
...10010
实际上对应的是
...16*1 + 8*0 + 4*0 + 2*1 + 1*0
所以 x 的任意次方,都可以写成由这些基本次方系数相乘的形式,所以可以使用查表方式得到
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18  | class Solution {public:    double myPow(double x, int n) {        if(n == 0) return 1;        if(n < 0) x = 1.0 / x;        unsigned int mn = n < 0 ? -n : n;        double bt[32] = {x};        for(int i = 1; i < 32; ++i){            bt[i] = bt[i - 1] * bt[i - 1];        }        double result = 1;        for(int i = 0; i < 32; ++i){            if(mn & (1<<i))                result *= bt[i];        }        return result;    }}; | 
                    
                
                
            
        
浙公网安备 33010602011771号