LeetCode 29 Divide Two Integers 除法的原理

Divide Two Integers

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

If it is overflow, return MAX_INT.

解题思路:这道题非常有意思,让我们利用基本的运算符号实现除法运算法则,由于基础数学知识的空白,在我原来学习除法的时候,并没有深入除法的本质,在过去我的眼里,除法运算就是个机械的算法,一个封装了的实现。现在,由于这道编程题让我深刻反思了除法原理。算法是这样的,让除数右移(二进制位的右移操作)使得除数扩大接近被除数,直到除数增大有余数存在,让被除数减去这个增大后的除数,让余数去进行判断。也要考虑最小整数的越界情况,比如-2147483648取相反数后结果为-2147483648。因为最大整数为2147483647。因此,在这里,遇到最大负数和-1的时候,返回结果直接选择最大整数即可。


代码如下:

public int divide(int dividend,int divisor){
		 int tag =1;//整数
		 long a = dividend;
		 long b = divisor;
		 if(divisor == 1) return dividend;
	        if(divisor == -1) {
	        	if(dividend==Integer.MIN_VALUE){
	        		return Integer.MAX_VALUE;
	        	}
              return -dividend;
	        	}
		 if(dividend>=0&&divisor>=0||dividend<=0&&divisor<=0){
			 tag=1;
		 }else{
			 tag=-1;
		 }
	      a = Math.abs((long)a);
	      b = Math.abs((long)b);
        if(a<b){
        	return 0;
        }
        int re=0;
        while(a>=b){
        	 int temp =1;
        	 long bt= b;
    		 while(a>=bt<<1){
    			 bt=bt<<1;
    	         temp = temp<<1;
    		 }
        	re+=temp;
        	a-=bt;
        }
		
		 return re*tag;
	 }
整个实现是在参考http://www.cnblogs.com/reynold-lei/archive/2013/10/15/3369494.html下实现的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值