当前位置: 首页 > news >正文

java练习(45)

ps:题目来自力扣

两数相除

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

整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。

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

注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231,  231 − 1] 。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。

class Solution {
    public int divide(int dividend, int divisor) {
        // 处理边界情况,当被除数为最小值且除数为 -1 时,结果会超出 32 位有符号整数范围,直接返回最大值
        if (dividend == Integer.MIN_VALUE && divisor == -1) {
            return Integer.MAX_VALUE;
        }

        // 判断结果的符号,通过异或运算判断两数符号是否不同
        boolean negative = (dividend ^ divisor) < 0;

        // 将被除数和除数都转换为负数,因为负数的范围更大,能避免溢出问题
        dividend = -Math.abs(dividend);
        divisor = -Math.abs(divisor);

        int result = 0;
        while (dividend <= divisor) {
            int tempDivisor = divisor;
            int multiple = 1;
            // 不断将除数翻倍,同时倍数也翻倍,直到翻倍后的除数大于当前被除数
            while (dividend - tempDivisor <= tempDivisor) {
                tempDivisor <<= 1;
                multiple <<= 1;
            }
            // 减去当前能减去的最大的除数倍数
            dividend -= tempDivisor;
            // 累加对应的倍数到结果中
            result += multiple;
        }

        // 根据之前判断的符号,决定结果的正负
        return negative ? -result : result;
    }
}

代码解释

本题要求在不使用乘法、除法和取余运算的情况下,计算两个整数的商,并且要考虑 32 位有符号整数的范围。我们可以采用减法和位运算的方法来模拟除法。

具体步骤

  1. 处理边界情况
    • 当被除数为 Integer.MIN_VALUE 且除数为 -1 时,商为 Integer.MAX_VALUE + 1,会超出 32 位有符号整数的范围,所以直接返回 Integer.MAX_VALUE
  2. 判断结果的符号
    • 通过异或运算 (dividend ^ divisor) < 0 判断被除数和除数的符号是否不同,如果不同则结果为负。
  3. 将被除数和除数转换为负数
    • 为了避免溢出问题,将被除数和除数都转换为负数,因为负数的范围比正数大。
  4. 模拟除法过程
    • 使用 while 循环,只要被除数小于等于除数,就继续进行除法操作。
    • 在每次循环中:
      • 初始化临时除数 tempDivisor 为除数,倍数 multiple 为 1。
      • 不断将 tempDivisor 翻倍,同时 multiple 也翻倍,直到 tempDivisor 大于当前被除数。
      • 用被除数减去 tempDivisor,并将 multiple 累加到结果 result 中。
  5. 根据符号返回结果
    • 根据之前判断的符号,决定最终结果的正负,如果为负则返回 -result,否则返回 result

相关文章:

  • 惯导(机械编排)算法(INS Mechanization)_预备知识笔记
  • 大语言模型的评测
  • server.servlet.session.timeout: 12h(HTTP 会话的超时时间为 12 小时)
  • # C# 中堆(Heap)与栈(Stack)的区别
  • 一文掌握使用深度学习识别验证码详解(包括图形验证码和滑块验证码)
  • Delphi 12.3 函数指针(函数可以当参数)
  • 7.1 线性代数进行图像处理
  • 【博资考4】网安学院-硕转博考试内容
  • 判断奇数偶数
  • Composer如何通过GitHub Personal Access Token安装私有包:完整教程
  • next.js-学习3
  • 【Multipath网络层协议】MPTCP工作原理
  • 【项目管理】基于 C 语言的 QQ 聊天室实现(TCP + 多线程 + SQLite3)
  • Hadoop完全分布式安装配置
  • Rider 安装包 绿色版 Win/Mac/Linux 适合.NET和游戏开发者使用 2025全栈开发终极指南:从零配置到企业级实战
  • 面向对象基础
  • 本地搭建dify结合ollama+deepseek方法详解
  • 2025最新智能优化算法:人工旅鼠算法(Artificial Lemming Algorithm, ALA)求解23个经典函数测试集,MATLAB
  • Spring原理
  • Android 布局系列(四):ConstraintLayout 使用指南
  • 国家能源局:成立核电工程定额专家委员会
  • 哪都“差一点”的《歌手2025》,还能爆吗?
  • 国家消防救援局应急通信和科技司负责人张昊接受审查调查
  • 破题“省会担当”,南京如何走好自己的路?
  • 上海电视节评委会名单公布,陈宝国担任电视剧评委会主席
  • 国家发改委谈稳定外资:将研究制定鼓励外资企业境内再投资政策措施