题目


Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.
Return the quotient after dividing dividend by divisor.
The integer division should truncate toward zero.
Example 1:
  Input: dividend = 10, divisor = 3
  Output: 3
Example 2:
  Input: dividend = 7, divisor = -3
  Output: -2
Note:

  • Both dividend and divisor will be 32-bit signed integers.
  • The divisor will never be 0.
  • Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: \([−2^{31}, 2^{31} − 1]\). For the purpose of this problem, assume that your function returns \(2^{31} − 1\) when the division result overflows.

思路


位移运算

(1)题意

要求我们实现两个整数的除法的操作,并且不能使用乘、除、模运算。两个整数都是32位整数,假设被除数是M,除数是m。

(2)特殊情况:溢出

除法的溢出有两种情况:

  • 除数m为0(虽然题目已经假设m不为0,但是自己还是要考虑到);
  • 被除数M是最小数INT_MIN,除数m为1。
(3)符号处理:异或

在除法操作中,同号为正,异号为负,这有点类似于异或操作:值相同异或为0,值不同异或为1。于是我们利用一个标志位来记录符号。再对被除数M和除数m取绝对值,这里注意,取绝对值时,由于32位整数范围为\([−2^{31}, 2^{31} − 1]\),在对除数m取绝对值时,必须将类型设置long或者long long型,否则当除数m为最小值时,取绝对值后会溢出。

(4)除法实现:逐渐逼近

题目要求不能利用乘、除、取模来实现除法。首先看除法的意义,假设36 / 9 = 4,将它换成36 - 9 - 9 - 9 - 9 = 0,这个时候发现可以用减法来逐渐逼近:36减去4次9等于0,而36除以9也是4(实际上减去减去4次9就是9 *4了)。另一种情况是:如果不能整除怎么办?假设36 / 8 ,它的商是4。换成36 - 8 - 8 - 8 - 8 =4 < 8,这个时候发现不够减了,就不减了,商正好是4。于是我们可以用一个循环来实现除法操作:看被除数M减去了几次除数m,将减去多次m后的值与m比较(小于等于m时),得到商。
但是,这种每次只减一个除数m的循环太慢了,程序很容易超时。我们希望每次可以多减几个m,比如2的倍数次。为什么是2的倍数次?因为两次可以用位运算实现。
m << 0 相当于m * 1
m << 1 相当于m * 2
m << 2 相当于m * 4
于是我们需要利用一个变量i来记录位运算的移动次数,以及一个临时变量来记录除数m的左移操作之后的结果(m << i)。
此时的循环变为M 与 m << i比较。

Tips


位操作(C++)

(1)位运算
& 逻辑与 0 & 1 =0
| 逻辑或 0
^ 异或 0 ^ 1 = 1
~ 逐位求反 ~1 = 0
<< 左移 8 << 1 = 16
>> 右移 8 >> 1 = 4
<<= 左移后赋值 a <<=1 即 a= a<<1
>>= 右移后赋值 a >>=1 即 a= a>>1
(2)用途
  • 由上面可以看出a<<b就是将a乘以2的b次方(\(a * 2^b\))。通常认为<<1要比2更快,因为位移操作是更底层的一些操作。因此程序中2的操作尽量用>>1代替,以提高程序效率。此外,可以用1<<来定义一些常量。
  • 类似地,a>>b就是将a除以2的b次方取整(\(\frac{a}{2^b}\))。通常用>>1来代替/2的操作,比如二分查找,堆的插入操作等。想办法用>>代替除法可以使程序的效率大大提高。

C++

class Solution {
public:int divide(int dividend, int divisor) {//首先考虑特殊情况:溢出if(divisor == 0 || (dividend == INT_MIN && divisor == -1))return INT_MAX;//异或操作处理正负号bool isNeg = ((dividend < 0) ^ (divisor < 0));long m = abs((long)dividend); //被除数long n = abs((long)divisor); //除数,这里必须是long或者long,否则取绝对值后会溢出。long result = 0; //商long count = 0; //记录次数while(m >= n){long tempVal = n; //记录左移操作的中间结果count = 0;//每次乘以2,直到不能减为止while(m >= (tempVal << 1)){count ++;tempVal <<= 1;}m -= tempVal;result += 1 << count;}return isNeg ? -result : result;     }
};

Python

参考

[1] https://blog.csdn.net/a1351937368/article/details/77746574/

转载于:https://www.cnblogs.com/Jessey-Ge/p/11043535.html

29. Divide Two Integers[M]两数相除相关推荐

  1. postgre非零相除等于0_LeetCode刷题实战29:两数相除

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  2. leetcode 29.两数相除

    leetcode 29.两数相除 题目描述 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 ...

  3. LeetCode高频题29. 两数相除:不用加减乘除号,求加法,减法,乘法,除法

    LeetCode高频题29. 两数相除 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们在公司养了一大批ACM竞赛 ...

  4. LeetCode-中等-29. 两数相除

    LeetCode-中等-29. 两数相除 题目 引用自:LeetCode-中等-29. 两数相除(如有侵权联系删除) 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不 ...

  5. Java实现 LeetCode 29 两数相除

    29. 两数相除 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商 ...

  6. leetcode 29 两数相除 C语言

    题目 leetcode 29 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 diviso ...

  7. leetcode第29题python版两数相除

    class Solution:"""29. 两数相除给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符.& ...

  8. LeetCode 27移除元素28实现strStr()29两数相除

    维护幸苦,如有打卡欢迎关注公众号bigsai回复进群,如有帮助欢迎点赞支持! 移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长 ...

  9. [Leetcode][JAVA]第[29]题[两数相除][二分法]

    [问题描述][中等] 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符.返回被除数 dividend 除以除数 divisor 得到的 ...

  10. LeetCode 29. 两数相除(位运算)

    1. 题目 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示 ...

最新文章

  1. 雷军、张小龙:高手的努力深入而轻松,普通人的努力肤浅而痛苦!
  2. php要用到哪些软件吗,php开发需要用什么程序
  3. Node.js 15 正式发布,14 将支持到 2023 年
  4. ipcs ipcrm命令
  5. 八、TFTP服务器搭建及应用
  6. 使用 Python 制作属于自己的 PDF 电子书
  7. 项目管理 管理的是什么?
  8. [js开源组件开发]图片放大镜
  9. html类选择器使用在什么场景,CSS选择器
  10. 微软新闻推荐:深度学习与 NLP 的融合, 让 Windows 11“新闻与兴趣”知你所需...
  11. .net|dotnet应聘人员应该掌握的知识点
  12. HNOI2017 滚粗记
  13. 广播域与冲突域的区别
  14. 网站并发cpu占用率_来,控制一下 goroutine 的并发数量
  15. 10清理roaming文件夹_Win10系统的C盘哪些文件可以删除?C盘文件夹功能介绍
  16. html视频直播源码,用HTML5开发简单的视频播放器,附源码
  17. SpringBoot(尚硅谷)
  18. docker修改容器ip范围
  19. CPU数据总线和地址总线 内存和外存
  20. 分享几个免费的根据IP 获取地址的链接

热门文章

  1. 拓端tecdat|R语言贝叶斯非参数模型:密度估计、非参数化随机效应meta分析心肌梗死数据
  2. 拓端tecdat|R语言中回归模型预测的不同类型置信区间应用比较分析
  3. keras ImageDataGenerator数据增强
  4. python通过文件路径读取图片
  5. Tensorspace一款神奇的神经网络可视化应用
  6. mysql教研室_MySQL数据库 范式
  7. 计算机英语演讲主题ppt模板,英文演讲主题PPT模板
  8. 支持向量机_支持向量机(SVM)说明及示例
  9. linux\虚拟机\docker如何查看操作系统版本、内核、cup等信息
  10. java执行脚本命令 学习笔记