[LeetOode][Java] Divide Two Integers

原创 2015年07月11日 10:09:34

题目:

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

If it is overflow, return MAX_INT.

题意:

不使用乘法,除法和取余操作,令两个整数相除.

如果溢出,就返回 MAX_INT.

算法分析:

参考博客http://blog.csdn.net/linhuanmars/article/details/20024907


  * 我们知道任何一个整数可以表示成以2的幂为底的一组基的线性组合,即num=a_0*2^0+a_1*2^1+a_2*2^2+...+a_n*2^n。基于以上这个公式以及左移一位相

当于乘以2,

 * 我们先让除数左移直到大于被除数之前得到一个最大的基。然后接下来我们每次尝试减去这个基,如果可以则结果增加加2^k,然后基继续右移迭代,直到

基为0为止。

 * 因为这个方法的迭代次数是按2的幂直到超过结果,所以时间复杂度为O(logn)。 


AC代码:

<span style="font-size:12px;">public class Solution
{
    public int divide(int dividend, int divisor) 
    {
        if(divisor == 0)
        {
            return Integer.MAX_VALUE;
        }
        boolean isNeg = (dividend^divisor)>>>31 == 1;//以上句子无符号右移一位!是以二进制代码进行的! ^为异或运算
        int res = 0;
        if(dividend == Integer.MIN_VALUE)  
        {  
            dividend += Math.abs(divisor); //因为测试数据出现了-2147483648,还不能把它转成正的(2147483648就溢出了),所以提前加上一个除数 
            if(divisor == -1)  
            {  
                return Integer.MAX_VALUE;  
            }  
            res++;  
        }
         if(divisor == Integer.MIN_VALUE)
        {
            return res;//这里除数的绝对值已经为最大了,任何数除以这个数,结果的绝对值最终都会小于1 ,取整就是0喽
        }
        dividend = Math.abs(dividend);
        divisor = Math.abs(divisor);
        int digit = 0;
        while(divisor <= (dividend>>1))
        {
            divisor <<= 1;
            digit++;
        }
        while(digit>=0)
        {
            if(dividend>=divisor)
            {
                res += 1<<digit;//(res=res+(1*2^digit))--->结果增加加2^k
                dividend -= divisor;
            }
            divisor >>= 1;
            digit--;
        }
        return isNeg?-res:res;
    }
}</span>


版权声明:本文为博主原创文章,转载注明出处

相关文章推荐

LeetCode 29 Divide Two Integers (C,C++,Java,Python)

Problem: Divide two integers without using multiplication, division and mod operator. If it ...

29. Divide Two Integers(Java)

29. Divide Two Integers(Java) Divide two integers without using multiplication, division and mod ope...

【LeetCode-面试算法经典-Java实现】【029-Divide Two Integers(两个整数相除)】

【029-Divide Two Integers(两个整数相除)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Divide two integers without u...

Divide_Two_Integers(低时间复杂度版)

题目描述:Divide two integers without using multiplication, division and mod operator.                 译...

[LeetCode]029-Divide Two Integers

题目: Divide two integers without using multiplication, division and mod operator.If it is overflow, ...

29. Divide Two Integers

两个整数相除

LeetCode 之 Divide Two Integers

LeetCode 之 Divide Two Integers Divide two integers without using multiplication, division and mod ...

【leetcode】Divide Two Integers

题目:不用乘、除、取模运算来实现除法。 减法可以实现除法在是我们早就知道的,但是可能会出现问题,比如极端情况,a = 0x7FFFFFFF,b = 1,求a/b,这要减法运算多少次? 回想下我们开...

leetcode笔记:Divide Two Integers

题目的意思简单明了,就是要求不使用乘法、除法和取余mod,输入两个整数,输出除法操作的结果。...

Divide Two Integers题解以及类似题目的总结

Divide Two Integers题解以及类似题目的总结 先说这道题 29. Divide Two Integers Divide two integers without using...
  • lcxywfe
  • lcxywfe
  • 2016年10月13日 11:18
  • 140
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[LeetOode][Java] Divide Two Integers
举报原因:
原因补充:

(最多只允许输入30个字)