两数相除

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

示例 1:  输入: dividend = 10, divisor = 3 输出: 3

示例 2:  输入: dividend = 7, divisor = -3 输出: -2

说明:

  • 被除数和除数均为 32 位有符号整数。
  • 除数不为 0。
  • 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31,  2^31 − 1]。本题中,如果除法结果溢出则返回 2^31 − 1。

思路:位运算

     如果被除数大于或等于除数,则进行如下循环,定义变量m等于除数,定义计数n,当m的两倍小于等于被除数时,进行如下循环,m扩大一倍,n扩大一倍,然后更新num和bc。这道题的OJ给的一些test case非常的讨厌,因为输入的都是int型,比如被除数是-2147483648,在int范围内,当除数是-1时,结果就超出了int范围,需要返回Integer.MAX_VALUE,所以对于这种情况我们就在开始用if判定,将其和除数为0的情况放一起判定,返回Integer.MAX_VALUE。然后我们还要根据被除数和除数的正负来确定返回值的正负,这里我们采用长整型long来完成所有的计算,最后返回值乘以符号即可。

 public int divide(int dividend, int divisor) {
    if(divisor == 0 || (dividend == Integer.MIN_VALUE && dividend == -1)){
        return Integer.MAX_VALUE;
    }
    long bc = Math.abs((long)dividend); //被除数
    long c = Math.abs((long)divisor); //除数
    int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
    int num = 0;
    while(bc >= c){
        long m = bc;
        long n = 1;
        while(bc >= (m << 1)){
            m <<= 1;
            n <<= 1;
        }
        num += n;
        ms -= m;
    }
    return num * sign;
 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值