50. Pow(x, n) (数值的整数次方)
1. 题目翻译
求一个数值的整数次方,实现pow(x,n)功能。
2. 解题方法
使用二分法,通过下面公式
an={an2∗an2an−12∗an−12∗an为偶数n为奇数
可知当n为偶数时 an 就等于两个 an2 相乘,为奇数时只要在乘以a本身就可以,所以可以用递归求解。
有几个问题需要考虑:
- 当n为负值时,我们需要将得到的结果求倒数。
- 当n为负值时,如果x为0,无法求倒数,因为不能除以0。 注意:将x与0.0比较时,因为精度问题无法直接比较,需要将两者差的绝对值与0.00000001比较。
- 当n为-2147483648时,会越界。
3. 代码
//Runtime: 6ms
class Solution {
private:
double Pow(double x, long long n) {
if (n == 0)
return 1.0;
double result = myPow(x, n>>1);
result *= result;
if (n % 2)
result *= x;
return result;
}
public:
double myPow(double x, int n) {
if ((x - 0.0>-0.00000001) && (x - 0.0 <0.00000001))
return 0.0;
if (n >= 0)
return Pow(x, n);
else {
long long m = -n;
if (n == -2147483648)
m = 2147483648;
return 1.0 / Pow(x, m);
}
}
};