1. 题目

Implement pow(x, n).

2. 思路

每次翻倍,如果当前翻倍的幂次在n的二进制位内,则乘入最后结果中,否则跳过继续。
特殊场景较多,要特别考虑:

  1. 幂次n可能是负数,这是要注意转换为正数后,最后求导。

  2. n如果是numeric_limits<int>::min()的值,如果下面的代码中i用int表示,i最后会越界,导致死循环,因为i会变为负数,abs_n会变大,而之后i变为0,abs_n不会再减小,于是就死循环了。

  3. 第一遍在while循环里,不是用的abs_n的每次减去已乘的个数。而是i>n,当n很大的时候,i会越界导致错误。

3. 代码

耗时:6ms

class Solution {
public:
    // n的二进制位上的, 每一个都是2的幂数, 翻倍相乘;多个结果相乘即可。
    double myPow(double x, int n) {
        long long abs_n = abs((long long)n);
        double sum = 1.0;
        long long i = 1;
        double i_sum = x;
        while (abs_n > 0) {
            if (i & abs_n) {
                sum *= i_sum;
                abs_n -= i;
            }
            i_sum *= i_sum;
            i <<= 1;
        }
        if (n > 0) {
            return sum;
        } else {
            return 1/sum;
        }
    }
};

knzeus
72 声望28 粉丝

行万里路,读万卷书