(LeetCode) Divide Two Integers (Java)思路讲解及实现

来源:互联网 发布:辛普森一家学英语知乎 编辑:程序博客网 时间:2024/06/06 08:48

本文将详细介绍Divide Two Integers 的解题思路及Java实现。

题目如下:

Divide two integers without using multiplication, division and mod operator. (在不使用乘法,除法和取余操作的情况下实现整数的除法运算)

If it is overflow, return MAX_INT.(整型溢出则返回最大整数)

题目分析:

1. 被除数/除数=商 (忽略余数)=> 被除数=除数*商。

2. 商(任意整数)可以表示为:a_0*2^0+a_1*2^1+...a_i*2^i+...+a_n*2^n.

3. 在Java中左移操作<<相当于对一个数乘以2,右移操作相当于除以2.

4.我们让除数左移直到大于被除数前的的一个数,例如计算28/3,我们进行三次左移操作,使3*2*2*2=3*8=24<28(注意四次左移操作得到3*2^4=48>28).记录下2*2*2=2^3=8.

5.我们让28减去24得到4,然后像第四步一样计算4/3,则3*2^0=3<4.记录下2^0=1.

6.由于4-3=1小于除数3,停止计算,并将每轮得到的值相加,在本例中8+1=9,记得到商(即28/3=9)。

至此,程序的主题思想已经介绍完了,接下来要注意数据左移和求整数绝对值的边界问题。

7. 将输入的Int(32位)型数字转换为long(64位)型。

8. 考虑MIN_VALUE/-1的特殊情况。

Java实现代码如下:

 static int divide(int dividend, int divisor){        int result=0;        if(divisor == 0) //除数为0,返回最大值            return Integer.MAX_VALUE;        if(dividend == Integer.MIN_VALUE && divisor == -1){            return ~dividend;        }        long dividend1 = Math.abs((long)dividend);        long divisor1 = Math.abs((long)divisor);        while(dividend1 >= divisor1)//当被除数大于除数时,进行位移操作        {            int shiftnum = 0;            while(dividend1 >= divisor1<<shiftnum){                shiftnum++;//记录左移次数(比实际次数多1)            }            result += 1<<(shiftnum-1);            dividend1 -= divisor1<<(shiftnum-1);//更新被除数的值        }        if((dividend>0 && divisor>0)||(dividend<0 && divisor<0))//计算正负数            return result;        else            return -result;    }

欢迎大家留言讨论!
0 0
原创粉丝点击