leetcode 29. 两数相除 击败100%

本文介绍了一种在不使用乘法、除法和模运算符的情况下,实现两个32位有符号整数相除的算法。通过位操作和逐位比较,实现了除法的模拟运算,同时处理了各种边界情况,如除数为0、被除数和除数为最小整型数等。

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

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

示例 1:

输入: dividend = 10, divisor = 3 输出: 3 示例 2:

输入: dividend = 7, divisor = -3 输出: -2 说明:

被除数和除数均为 32 位有符号整数。 除数不为 0。 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1]。本题中,如果除法结果溢出,则返回 2^31 − 1。

public static int divide(int dividend, int divisor) {
        //除数-0的处理
        if (divisor == 0) {
            return Integer.MAX_VALUE;
        }
        //除数=最小整型数的处理
        if (divisor == Integer.MIN_VALUE) {
            if (dividend == Integer.MIN_VALUE) {
                return 1;
            }
            return 0;
        }
        //被除数=最小整型数且除数=-1,结果溢出的处理
        if (dividend == Integer.MIN_VALUE && divisor == -1) {
            return Integer.MAX_VALUE;
        }
        //被除数=0直接返回0
        if (dividend == 0) {
            return 0;
        }
        //被除数、除数正负位标志
        boolean negtive1 = true;
        boolean negtive2 = true;
        //判断是否为正数
        if ((dividend & 0x80000000) == 0) {
            negtive1 = false;
            //变为负数
            dividend = ~dividend + 1;
        }
        if ((divisor & 0x80000000) == 0) {
            negtive2 = false;
            divisor = ~divisor + 1;
        }
        //记录最终结果的正负
        if (negtive1 && negtive2 || !negtive1 && !negtive2) {
            negtive1 = false;
        } else {
            negtive1 = true;
        }
        int target = 0;
        int countBit = 0;
        int temp = divisor;
        //模拟除法运算,先找到除数最大可以左移到多少
        while (dividend <= temp) {
            //当temp<= -2的29次方,持续翻倍
            if (temp >= 0xf0000000) {
                temp <<= 1;
                //防止左移去掉了符号位
                temp |= 0x80000000;
                countBit++;
            } else {
                break;
            }

        }
        //模拟除法逐位的运算
        while (countBit >= 0 && dividend <= divisor) {
            int count = 0;
            //由于都是负数,所以被除数应该小于等于temp
            while (dividend <= temp) {
                count++;
                dividend -= temp;
            }
            //做了多少次减法,就是该位除之后的结果
            target += (count << countBit);
            countBit--;
            temp >>= 1;
        }
        //变为负数
        if (negtive1) {
            target = ~target + 1;
        }
        return target;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值