第29题 两个整型相除

Posted 且听风吟-wuchao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第29题 两个整型相除相关的知识,希望对你有一定的参考价值。

题目如下:

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

If it is overflow, return MAX_INT.

 

分析:

整型相除,不使用乘除法的话,只能使用减法较为简单了。即循环使用被减数去减减数。但如果被减数很大,减数很小,则循环次数太大,效率过低。因此可以对减数进行放大,以逼近被减数。放大倍数设为2,即左移位操作。

注意:移位前先将整型转为long类型,否则移位可能溢出。

代码如下:

package T029;

public class DivideTwoIntegers {

    public static void main(String[] args) {
//divide(-2147483648,-1)
        System.out.println(divide(-2147483648,-2));
    }
    
    public static int divide(int dividend, int divisor) {
        long isNegative = (dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0) ? -1 : 1;
        long absDividend = Math.abs((long) dividend);
        long absDivisor = Math.abs((long) divisor);
        long result = 0;
        while(absDividend >= absDivisor){
            long tmp = absDivisor, count = 1;
            while(tmp <= absDividend){
                tmp <<= 1;
                count <<= 1;
            }
            result += count >> 1;
            absDividend -= tmp >> 1;
        }
        result = result*isNegative;
        if(result>Integer.MAX_VALUE || result <Integer.MIN_VALUE) return Integer.MAX_VALUE;
        return  (int) result;
    }
    
}

 

以上是关于第29题 两个整型相除的主要内容,如果未能解决你的问题,请参考以下文章

#leetcode刷题之路29- 两数相除

delphi整型变量相除,要求结果为小数

Java两个整型相除结果转成浮点型

辗转相除法求最大公约数c语言代码

Leetcode29. 两数相除

将两个整数相除时,Clang 会产生奇怪的输出