Divide Two Integers:实现除法

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

If it is overflow, return MAX_INT.

思路:这道题难点在于边界处理。

首先强调:

1)-Integer.MIN_VALUE!=Integer.MAX_VALUE ,所以当被除数为Integer.MIN_VALUE,除数为-1时,需要判断

2)Integer.MIN_VALUE)==Integer.MIN_VALUE,所以需要转型为long

整体思路:以38/2为例

对于38:

38>=4 余34

38>=8 余30

38>=16 余22

38>=32 余6

因为38<64 ,所以38-32余6,包含1<<4==16个2,

对于余数6:

6>=4 余2

因为6<8,所以6-4余2,包含1<<2==2个2

对于余数2:

因为2<4,所以2-2余0,包含1<<1 =1个2

对于余数0:

因为小于除数,所以到此结束。

最后共包含:16+2+1 = 19个2,结果为19

public int divide(int dividend, int divisor) {
	        if((divisor==0)||(dividend==Integer.MIN_VALUE&&divisor==-1)) return Integer.MAX_VALUE;//因为Integer.MIN_VALUE/-1=Integer.MIN_VALUE,不信的话可以自己试一下
	        int result = 0;
	        int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;
	        long bd = Math.abs((long)dividend);
       //注意: Math.abs(Integer.MIN_VALUE)==Integer.MIN_VALUE,所以在此转型
	        long d = Math.abs((long)divisor);
	        while(bd>=d){
	        	long temp = d;
	        	int c = 1;//因为被除数大于等于除数,所以至少包含一个
	        	while(bd>=(temp<<2)){
	        		temp<<=2;
	        		c<<=2;
	        	}
	        	bd -=temp;
	        	result +=c;	        	
	        }
	        return (sign==-1)?-result:result;
	    }
时间复杂度:O(logn)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值