29. Divide Two Integers

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.


思路: 需要注意的是Math.abs(Integer.MIN_VALUE)=Integer.MAX_VALUE+1;

因此当遇到被除数是Integer.MIN_VALUE时,需要将其单独拿出来处理;

由一个数的二进制形式可以知道,x=a0*2^n0+a1*2^n1+...+ak*2^nk;被除数

y=b0*2^n0+b1*2^n1+...+bj*2^nj;  除数

15除以3: 15-3*2^2=3, 3-3*1=0,0<3终止,因此最后的值是3+1=4;

时间复杂度: O(logN)

public int divide(int dividend, int divisor) {
        if(divisor==0||(dividend==Integer.MIN_VALUE&&divisor==-1))
            return Integer.MAX_VALUE;
        
        if(divisor==Integer.MIN_VALUE&÷nd>Integer.MIN_VALUE)
            return 0;
        if(divisor==Integer.MIN_VALUE&÷nd==Integer.MIN_VALUE)
            return 1;
        int sign=(dividend<0)^(divisor<0)?-1:1;//最终的符号
        
       
        int dvs=Math.abs(divisor);
        
        int result=0;
        if(dividend==Integer.MIN_VALUE){
            result=1;
            result+=divide(Math.abs(dividend+dvs),dvs);
            return result*sign;
        }
        int dvd=Math.abs(dividend);
        int i,j;
        while(dvd>=dvs){
            i=1;
            j=dvs;
            while(dvd>=((long)j<<1)){//可能会越界
                i<<=1;
                j<<=1;
            }
            dvd-=j;
            result+=i;
            
        }
        return result*sign;
    }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值