Leetcode JAVA刷刷站(29)两数相除

一、题目概述

二、思路方向

       在Java中,如果不使用乘法、除法和取余运算来实现整数除法,我们可以采用位运算(特别是左移和右移操作,它们分别相当于乘以2的幂和除以2的幂)以及加减运算来实现。这种方法的关键在于利用二分查找的思想来逼近真实的商值。

三、代码实现 

public class Solution {  
    public int divide(int dividend, int divisor) {  
        // 处理特殊情况  
        if (divisor == 0) {  
            throw new IllegalArgumentException("Divisor cannot be zero.");  
        }  
        if (dividend == Integer.MIN_VALUE && divisor == -1) {  
            // Integer.MIN_VALUE 除以 -1 会溢出  
            return Integer.MAX_VALUE;  
        }  
  
        // 确保被除数和除数都是正数或都是负数,简化处理  
        boolean isNegative = (dividend < 0) ^ (divisor < 0);  
        long absDividend = Math.abs((long) dividend);  
        long absDivisor = Math.abs((long) divisor);  
  
        int result = 0;  
  
        // 使用位运算模拟除法  
        for (int i = 31; i >= 0; i--) {  
            // 尝试将absDivisor左移i位(相当于乘以2^i),检查是否仍然小于等于absDividend  
            if ((absDivisor << i) <= absDividend) {  
                absDividend -= (absDivisor << i); // 减去该部分  
                result += 1 << i; // 对应的商加上2^i  
            }  
        }  
  
        // 根据原始符号返回结果  
        return isNegative ? -result : result;  
    }  
  
    public static void main(String[] args) {  
        Solution solution = new Solution();  
        System.out.println(solution.divide(10, 3)); // 输出 3  
        System.out.println(solution.divide(7, -3)); // 输出 -2  
        System.out.println(solution.divide(0, 1)); // 输出 0  
        System.out.println(solution.divide(1, 1)); // 输出 1  
        System.out.println(solution.divide(Integer.MIN_VALUE, -1)); // 输出 Integer.MAX_VALUE  
    }  
}

执行结果: 

四、小结

解释

  1. 特殊情况处理:首先检查除数是否为0,以及被除数为Integer.MIN_VALUE且除数为-1的特殊情况。
  2. 符号处理:确定结果的符号,然后将被除数和除数都转换为正数(如果它们不是的话)。
  3. 位运算模拟除法:使用一个循环,从最高位(31位)开始,检查左移后的除数是否小于等于被除数。如果是,则从被除数中减去这个值,并将相应的商值(即1 << i)加到结果上。
  4. 返回结果:根据原始的符号返回结果。

       注意,这里使用long类型来避免在运算过程中发生整数溢出。在Java中,int类型在执行某些操作时可能会溢出,而使用long类型可以安全地处理更大范围的数值。最后,再将结果转换回int类型(如果它不会超出int的范围)。

 结语  

生活不止眼前的苟且

还有诗和远方的田野

!!!

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT 青年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值