【LeetCode】29、两数相除

【经典算法】LeetCode 29两数相除 (Java/C/Python3/Golang实现含注释说明,中等) 无论是使用哪种编程语言,实现整数除法的基本思路都是类似的。关键在于处理特殊情况(如被除数为最小值且除数为-1时),以及使用高效的算法来减少计算量。在实际应用中,还需要考虑语言的特性和限制,比如整数溢出的问题。在Python中,由于整数类型可以自动处理大整数,所以不需要担心溢出问题。在其他语言中,比如Java和C语言,需要特别注意整数溢出的情况,并进行适当的处理。按照实现方式聚类,可以将上述表格中的语言实现分为两大类:常规除法和位运算优化。 阅读详情

一、整数基础知识

1、整数是一种基本数据类型

  • 一共包括四种不同的整数类型,分别是:byte(1字节=8位),short(2字节),int(4字节),long(8字节)

  • 扩展,其他的基本数据类型, 浮点型(float,double),布尔型(bool),字符型(char),string不是基本数据类型,他是字符数组类型

2、整数数值表示范围

  • int类型表示的数值范围为(-2^31~2^31-1),也就是(-2147483648 - 2147483647)

  • 使用二进制表示,最高位为0则为正数,最高位为1为负数

3、正数运算遵循四则运算

  • 如果超出数值范围会产生溢出,不会报错,但最终结果不正确

二、LeetCode29 两数相除

1、题目信息:

  • https://leetcode.cn/problems/divide-two-integers/description/

给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。
整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。
返回被除数 dividend 除以除数 divisor 得到的 商 。
注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231,  231 − 1] 。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。

示例 1:
输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = 3.33333.. ,向零截断后得到 3 。

示例 2:
输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = -2.33333.. ,向零截断后得到 -2 。

提示:
-231 <= dividend, divisor <= 231 - 1
divisor != 0

2、解题思路:

  • 输入两个整数,分别是被除数dividend和除数divisor,现在要求不适用乘号,除号和取余运算符,来求两个数相除的结果。那可以选择使用加法、减法和位移运算符来实现。

  • 题目提到了使用int整数类型,可能会导致数值溢出,为解决这个问题,可对int类型进行类型转换为long。两个数都转换成正整数,至于他们相处的最终正负号使用一个变量sign来表示。

3、暴力解法:

  • 要求被除数与除数的商,可以先将两个数都转换成正整数,采用减法的方式来处理,使用while循环,判断条件为只要被除数比除数值大,则被除数的值就每次减少除数的大小,并计算while循环减去的次数,直到被除数的值小于除数。此时while循环中减去的次数就接近结果值。

  • 说接近结果值,还有一个是要考虑商的正负数处理。

4、画图理解:

5、代码实现:

int divide(int dividend, int divisor)
{
  long res = 0;
  int sign = 1; // 计算符号

  // 获取他的绝对值,先转成longlong类型,再转换符号
  long dividendL = dividend;
  long divisorL = divisor;
  // 获取绝对值
  if (dividend < 0)
  {
    dividendL = -dividendL;
  }
  if (divisor < 0)
  {
    divisorL = -divisorL;
  }

  // 获取正负数符号
  if ((dividend < 0 && divisor < 0) || (dividend >= 0 && divisor > 0))
  {
    sign = 1;
  }
  else
  {
    sign = -1;
  }

  while (dividendL >= divisorL)
  {
    dividendL -= divisorL;
    res++;
  }
  if (sign < 0)
  {
    res = -res;
  }

  if (res > INT32_MAX)
  {
    return INT32_MAX;
  }
  if (res < INT32_MIN)
  {
    return INT32_MIN;
  }
  return res;
}

三、折半解法:

1、解题思路:

  • 上面的暴力解法使用一层while循环,每次被除数减少除数的大小,他的时间复杂度为O(n)

  • 可以通过两层while循环,每次减少数据是除数的倍数,而且这个除数的倍数的结果值,要是小于被除数一半的最大值,而要计算确定除数的倍数值,可使用内层while循环来计算

  • 因为不能使用乘法,改为使用整数的移位操作,对除数不断左移<<,在内层while循环中对除数左移一位,他的倍数是2的n次方,直到倍数值大于被除数的一半为止。

  • 这样在外层while循环中,就可以一次性减去内层while循环计算得到的除数的倍数值。直到被除数小于除数值,这个倍数值不断累加就是最终结果值。

2、画图理解:

3、代码实现:

int divide(int dividend, int divisor)
{
  long res = 0;
  int sign = 1; // 计算符号

  // 获取他的绝对值,先转成longlong类型,再转换符号
  long dividendL = dividend;
  long divisorL = divisor;
  // 获取绝对值
  if (dividend < 0)
  {
    dividendL = -dividendL;
  }
  if (divisor < 0)
  {
    divisorL = -divisorL;
  }

  // 获取正负数符号
  if ((dividend < 0 && divisor < 0) || (dividend >= 0 && divisor > 0))
  {
    sign = 1;
  }
  else
  {
    sign = -1;
  }

  // 使用阶乘方式来处理
  long temp = 0;
  long multi = 0; // 重复的阶乘个数
  while (dividendL >= divisorL)
  {
    multi = 1;
    temp = divisorL;
    while (dividendL > (temp << 1))
    {
      multi = multi << 1; // 往左移动
      temp = temp << 1;
    }
    dividendL -= temp;
    res += multi;
  }
  if (sign < 0)
  {
    res = -res;
  }

  if (res > INT32_MAX)
  {
    return INT32_MAX;
  }
  if (res < INT32_MIN)
  {
    return INT32_MIN;
  }
  return res;
}

四、总结:

  • 整数包括始终数据类型,他有正负号与数值表示范围

  • 整数遵循四则运算法则,超过数值范围会导致数值溢出

  • 暴力解法采用被除数不断减去除数的次数,直到被除数小于除数

  • 折半解法采用两层while循环,每次减少被除数的一半,采用位移方式减出除数的2的倍数

【中等】力扣算法题解析LeetCode29:两数相除 要求在不使用乘法、除法和取余运算的情况下,实现两个整数的除法运算,结果向零截断。关键在于高效逼近被除数的绝对值,同时处理边界条件和符号问题。 方法思路 边界处理:若被除数为0,直接返回0。若被除数为Integer.MIN_VALUE且除数为-1,结果会溢出,返回Integer.MAX_VALUE。 符号确定:使用异或运算判断结果符号,两数符号不同时结果为负。 转换为负数:将被除数和除数转换为负数处理,避免正数转换时的溢出问题。 倍增法:通过不断翻倍除数和相应的倍数,快速逼近被除数。 阅读详情

相关推荐

LeetCode——29. 两数相除

LeetCode——29. 两数相除

qq_59708493的博客 930

leetcode力扣第29题:两数相除

(2)对于每一个可能得商,跟除数相乘,然后跟被除数比大小,根据大小关系来决定商应该去左边区间还是右边区间。这里不能直接用乘法,所以得用类似于二进制竖式的方式,快速通过加法结合位移运算实现“快速乘法”如果被除数是2^31-1或差不多大小的数,而除数是1差不多大小的数,那循环减法要执行的次数太多,一定会超时。最简单的做法是直接用减法,不停循环计数,最后统计减多少次能成。这题看似简单,实则一点也不难(不是),实则还是比较困难。还有一些细节上的难点,代码注释中写得很清楚。(1)通过二分法查找可能的商。

m0_63246220的博客 704

为ESXI Host添加v3700 FC存储

物理环境: ESXI Host version 5.1.0 Brocade SAN Switch v3700 Storage 存储和ESXI Host分别用光纤线连接在SAN交换机上 1.查询ESXI Host 的WWN号: 2. SAN交换机上查询存储的WWPN号 SAN交换机: 3.建立zone,添加到cfg文件中 brocade8Gb

haoshuwei531024的专栏 7562

LeetCode29-两数相除

LeetCode29-两数相除 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 示例 1: 输入: dividend = 10, divisor = 3 输出: 3 示例 2: 输入: dividend = 7, divisor = -3 输出: -2 说明...

lyd1995的博客 328

开发板的使用

一、开发板使用学习大纲。 1、开发板组成、核心板资源,底板资源。 2、开发板连接、调试工具、串口参数配置。 3、开发板启动过程。 4、文件传输 1)使用串口传输。 上传/下载 2)使用网口传输。 上传/下载 5、临时/永久配置开发板IP地址。 6、开发板启动脚本。 二、开发板的组成。 核心板: CPU处理器: 芯片:S5P6818(三星) 内核: ARM cortex-A53 -> 八核处理器 运行内存:512MB*2=1G nandflash:4G 底板: 电源线:5V 串口...

qq_45633736的博客 2659

Blender SMPL-X 插件安装

Blender XMPL-X 插件安装

heleneveryday的专栏 5358

leetcode 29.两数相除

leetcode 29.两数相除 题目描述 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 示例 1: 输入: dividend = 10, divisor = 3 输出: 3 示例 2: 输入: dividend = 7, divisor = -3 输出: ...

EngineerHe的博客 1684

钢铁雄心4存档修改全攻略:从基础设置到高级玩法(附国家代码表)

本文详细解析《钢铁雄心4》存档修改技巧,从基础设置到高级玩法全覆盖。包括存档文件位置、格式转换、国家实力调整、国际关系修改等实用内容,并附赠国家代码表。掌握存档修改技能,解锁游戏全部潜力,实现精细参数控制,超越控制台指令的局限。

weixin_29233857的博客 1432

【LeetCode 题解】算法:29.两数相除

在算法的世界里,常常会出现一些打破常规、挑战思维的题目。LeetCode 第 29 题 “两数相除” 便是其中之一。这道题不仅要求我们在不能使用乘法、除法和取余运算的前提下实现两数相除,还需要处理 32 位有符号整数的溢出问题,对编程者的逻辑思维和代码实现能力提出了较高要求。接下来,就让我们一起剖析这道题的解题思路和实现方法。​。

小高的博客 782

ilqr算法原理推导及代码实践

ilqr算法原理详解

Forwarding3的博客 1741

海康网口相机不能被flexscan3d识别到MVS版本为4.6.1,flex为3.3.24在MVS中能够检测到,但是在flex中只能看到电脑自带相机,如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1043

LeetCode 29-两数相除

LeetCode 29-两数相除 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 示例: 示例 1: 输入: dividend = 10, divisor = 3 输出: 3 示例 2: 输入: dividend = 7, divisor = -3 输出: ...

weizui0401的博客 225

【雕爷学编程】Arduino动手做(111)---震动提醒模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。

雕爷学编程 1898

力扣LeetCode第29题:两数相除,beat100%解法

时间复杂度: O(logN),其中N为被除数和除数倍数差,也即商。logN即为被除数和除数二进制的位数差,比如1011111/11,那么logN为7−2=5。空间复杂度: O(1)

m0_63246220的博客 894

MTK AWB 色温曲线的进一步猜想

平均距离来判断是否对该色温下白平衡进行全部收白处理,还是保留一些光源的本身的颜色。比如占据图像一大半左右的纯色背景,纵坐标值相对横坐标的距离应该会比较大,大于一般场景下的正常白点分布。反之,位于Plank_curve下方位置的点具有偏洋红色的倾向。此时拟合各个色温下的白点,拟合曲线大致是以X= 0.85)平行于横轴的一条直线。对原始坐标系中的点取对数后的Log坐标系空间。此时拟合各个色温下的白点,拟合曲线大致呈现的是一条直线。,可以认为是各种色温下白点分布所呈现的走向。的算法利用某个色温点的偏离。

大熊 722

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Leetcode 29 两数相除

Leetcode29 两数相除 原题地址:https://leetcode-cn.com/problems/divide-two-integers/ 题目描述: 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 示例 1: 输入: dividend = 10, d...

隔壁家的二大爷 259

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LeetCode 29 两数相除

LeetCode 29 两数相除 题目 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 示例 1: 输入: dividend = 10, divisor = 3 输出: 3 示例 2: 输入: dividend = 7, divisor = -3 输出: -2 ...

Ailecccc的博客 147

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

leetcode 29. 两数相除

''' leetcode 29. 两数相除 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 ''' class Solution: def divide(self, dividend: int, divisor: int) -> int: ...

WYXHAHAHA123的博客 174

leetcode29. 两数相除-medium

注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1;如果商 严格小于 -231 ,则返回 -231。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2。这道题如果完全按照题目要求还是挺麻烦的,因为计算过程中很容易就溢出了,所以要额外增加很多判断。,向零截断后得到 -2。,向零截断后得到 3。输入: dividend = 7, divisor = -3。

weixin_37253733的博客 1173

leetcode算法整理29两数相除

LEETCODE注解 29:两数相除 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 说明: 被除数和除数均为 32 位有符号整数。 除数不为 0。 假设我们的环境只能存储 32 位有符号整数,其数值范围是int [min, max]。 本题中,如果除法结果溢...

qq_39502383的博客 182

leetcode29(c++):两数相除

题目: 给定两个整数,两数相除但不能用乘法、除法和mod运算符。 且: 被除数和除数均为 32 位有符号整数。 除数不为 0。 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231-2^{31}−231, 2312^{31}231 − 1]。本题中,如果除法结果溢出,则返回 2312^{31}231 − 1。 思路 简单来说,这题就是要求被除数中能分出多少个除数出来。 那么这...

追 761

LeetCode-29-两数相除

LeetCode-29-两数相除 /*两数相除*/ #include<iostream> #include<math.h> using namespace std; int main(){ int dd, ds;//dd是被除数,ds是除数 long long res, s;//s为商 int flag = 0;//判断正负 cin >> dd >...

jindayue的博客 203

Python世界:力扣29题两数相除算法实践

除法运算本质是减法,从理解原理到真正实现还是有距离,建议初步理解后,不参考任何代码,完全自己复现一遍,体会更深。注意提示:目的就是提醒越界问题:-2^31/-1=2&31,超过了整数表达范围。本问题来自于力扣29题,在做完大数相乘后,顺带也看下两数相除。将两数相除,要求不使用乘法、除法和 mod 运算符。给定两个整数,被除数。

来知晓的博客 905

Leetcode29. 两数相除

Leetcode29. 两数相除 题目: 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 示例 1: 输入: dividend = 10, divisor = 3 输出: 3 示例 2: 输入: dividend = 7, divisor = -3 输出: -...

会流泪de鱼的博客 182

LeetCode2461~2480题目解析

LeetCode2461~2480题目解析

jiaomubai的博客 119
上一篇: 【C++】026、C++内存分布:全局变量、局部变量、static变量、const常量
下一篇: 【LeetCode】67、二进制求和
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值