首页 > 代码库 > leetcode. Pow(x, n)

leetcode. Pow(x, n)

Implement pow(xn).

直接把x自乘n-1次很容易实现,时间复杂度O(n).

实际上,x^n = x^(n/2) * x^(n/2), 这样只需要求一次 x^(n/2),再做一次乘操作即可,T(n) = T(n/2) + c, T(n) = lbn. (参见 CLRS 主定理)

同时要注意两个细节:

1、n可能为负数,需要取倒数,即 x^n = 1/(x^(-n)).

2、最小负数0x80000000直接转正数会溢出。

 1     double powpositive(double x, int n) 2     { 3         double ret = 0; 4         if (n == 0) 5             return 1; 6              7         ret = powpositive(x, n >> 1); 8         if (n & 1) 9             return ret * ret * x;10         else11             return ret * ret;12     }13     14     double pow(double x, int n)15     {16         if (n >= 0)17         {18             return powpositive(x, n);19         }20         else21         {22             if (n == 0x80000000)23                 return 1 / (powpositive(x, 0x7fffffff) * x);24             else25                 return 1 / (powpositive(x, -n));26             27         }28     }

 

leetcode. Pow(x, n)