Divide Two Integers LeetCode 解题报告

本文介绍了一种不使用乘除法和取余操作实现整数除法的方法,通过位移和加减法巧妙地实现了除法运算,并详细讨论了处理溢出的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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

If it is overflow, return MAX_INT.

思路

这道题是要求两个整数相除的结果,但是不能用乘除法和去余操作,但是我们可以使用加减和移位。假设现在有两个数:34和3,我们使用如下过程来计算34 / 3 ,3*2=6,小于34, 6*2 =12 ,仍然小于34,继续乘2,直到24*2 = 48 大于34,我们知道,最多到24,此时一共乘了8倍。34-24 = 10,再拿10去除以3,重复这个过程,这时还有3*3,10-3*3 = 1,小于除数3,退出除法。这个过程很像34 = 3*11+1。
这个题目的几个细节:
处理溢出
(1)、除数为0时
(2)、除数为-1且被除数为int的最小值时
(3)、int的最小值的绝对值比int最大值大1,在把数进行相除时需要把除数和被除数转为long,防止溢出。
在计算前先把除数和被除数都转为正数处理,可以方便计算。

代码

public static int divide(int dividend, int divisor) {
        //防止溢出
        if(divisor == 0 || (dividend == Integer.MIN_VALUE && divisor == -1))
            return Integer.MAX_VALUE;
        //确定符号
        int sign = ((dividend > 0)^(divisor > 0)) ? -1 : 1;
        long result = 0;
        //这两个数可能都是int的最小值,所以取绝对值前都要强转为long,结果也保存在long型中。
        long dvd = Math.abs((long)dividend);
        long div = Math.abs((long)divisor);
        while(dvd >= div){
            long tmp = div;
            long mul = 1;
            while(dvd >= (tmp << 1)){
                tmp <<= 1;
                mul <<= 1;
            }
            dvd -= tmp;
            result += mul;
        }
        return (int) (sign*result);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值