【LeetCode】C# 50、Pow(x, n)

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值