题目
Implement pow(x, n).
Subscribe to see which companies asked this question
思路
两种方法,一:一个一个乘,最多乘INT_MAX次,显然不太好。
二:每次求
n/2
次幂,最多32次
陷阱
此题陷阱非常多,主要需要考虑几种特殊情况:
1. n 为 0:结果为1
2. n 为负数,需要先求再求倒数,或者直接求
1/x
的-n次幂
3. n 为最小的数,INT_MIN,此时不能对n直接加‘-’求负数,因为INT_MIN的相反数还是它本身,此时要单独讨论。
4. x 为0,此时如果对x直接求倒数会导致溢出
5. x 为一很小数,需要将它和一极小数比较判0,不可以直接==0 判零
代码
double newPow(double x, unsigned int n){
double re;
re = myPow(x,n>>1);
re *= re;
if (n&1==1) re = re*x;
return re;
}
double myPow(double x, int n) {
if (n==0x80000000) return newPow(1/x,n);
if (n==0) return 1.0;
if (abs(x-0.0)<=0.00001) return 0.0;
if (n<0) return newPow(1/x,-n);
else return newPow(x,n);
}