Implement pow(x, n).
计算x的n次幂。
并没有特别的要求,发现能AC的时候我顿时就乐了。。。
public class Solution {
public double MyPow(double x, int n) {
double res = Math.Pow(x,n);
return res;
}
}
严肃。参考其他题友,
思路是通过迭代,不断二分n,来使其最终用最少的乘次数转化为一次幂的结果。但这么写有个问题,应该是以前大神AC的时候 还没有这个case,是的结果是这样的。
Input:
2.00000
-2147483648
Output:
Infinity
Expected:
0.00000
我不知道是为什么,网上找到的答案都这样,AC不了。之后我写了console输出调试后发现,
-2147483648 经过 n=-n;
之后结果仍然为 -2147483648。
百度了一下:
一般情况下 计算机是按照补码来保存的,所以把-2147483648看成2个部分,先把2147483648看成无符号整型 2的31次,机器数是0x80000000,然后对其取补码,结果仍为0x80000000,猜测Java负数取相反数过程为取补码的逆过程,首先-1,然后再取反,然后再符号位取反,0x80000000-1=0x7FFFFFFF,取反后0x00000000,符号位取反后仍为0x80000000。所以计算机在求-2147483648的相反数是仍然为-2147483648。同时比较-2147483648和2147483648时会发现返回的结果是二者相等。
public class Solution {
public double MyPow(double x, int n) {
if(n==0) return 1;
if(n<0){
n=-n;
x=1/x;
}
return (n%2 ==0) ? MyPow(x*x,n/2) : x*MyPow(x*x,n/2);
}
}
然后我改了下代码如下就成功了。
public class Solution {
public double MyPow(double x, int n) {
if(n==0) return 1;
if(n<0){
return 1/(pow(x,-n));
}
return pow(x,n);
}
public double pow(double x, int n){
if(n==0) return 1;
return (n%2 ==0) ? pow(x*x,n/2) : x*pow(x*x,n/2);
}
}