1. 题目
Implement pow(x, n).
2. 思路
每次翻倍,如果当前翻倍的幂次在n的二进制位内,则乘入最后结果中,否则跳过继续。
特殊场景较多,要特别考虑:
幂次n可能是负数,这是要注意转换为正数后,最后求导。
n如果是numeric_limits<int>::min()的值,如果下面的代码中i用int表示,i最后会越界,导致死循环,因为i会变为负数,abs_n会变大,而之后i变为0,abs_n不会再减小,于是就死循环了。
第一遍在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;
}
}
};