LeetCode29DivideTwoIntegers--In Java

主要采用的方法是:先不断通过移位操作找到divisor最接近dividend的倍数,如被除数是100,除数是3的话,这个倍数就是32。

然后用100减去3的32倍,这里的32倍是通过左移产生,并没有用到乘法。

这时,再用一个循环找到3的多少倍最接近于100和它32倍的差,即找到最接近于4的倍数,通过不断试探16倍,8倍,4倍。。。(通过右移),结果是1倍,为3。

再重复做差的动作,去找最接近1的3的倍数,当然是0倍。最后当做差的值小于3的一倍时,循环退出。

为了解决溢出的问题,参考了http://www.cnblogs.com/ganganloveu/p/4174062.html的方法,用long来进行运算,最后判定不溢出时再转换为int。

public int divide(int dividend, int divisor) {
		long m = dividend;
		long n = divisor;
		long absn = Math.abs(n);
		if(divisor==0){
			return Integer.MAX_VALUE;
		}
		if(dividend==0){
			return 0;
		}
		
		boolean flag1 = dividend<0?true:false;
		boolean flag2 = divisor<0?true:false;
		m = Math.abs(m);
		n = Math.abs(n);
		if(m<n)
			return 0;
		long ct = 1;//当前倍数
		long tempresult = 0;
		while((n<<1)<=m){
			n = n<<1;
			ct = ct<<1;
		}
		
		while(true){
			tempresult = tempresult + ct;
			
			m = m - n;
			n = n>>1;
			ct = ct>>1;
			
			while(m<n){
				n = n>>1;
				ct = ct>>1;
			}
			if(n<absn)
				break;
		}
		
		if((flag1==true&&flag2==false) || (flag1==false&&flag2==true))
			return -(int)tempresult;
		if(tempresult>Integer.MAX_VALUE)
			return Integer.MAX_VALUE;
		return (int)tempresult;
    }


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值