首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Leetcode 29 Divide Two Integers 位操作的巧妙运用

Leetcode 29 Divide Two Integers 位操作的巧妙运用

作者头像
triplebee
发布于 2018-01-12 07:08:26
发布于 2018-01-12 07:08:26
72900
代码可运行
举报
运行总次数:0
代码可运行

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

题意很简单,实现两数除法,但是不能用乘法,除法和取模。

怎么样?第一感觉就是用减法,但是被除数很大,除数为1的时候肯定会超时,

那就模拟手工除法,按位减呗,这样每一位减的次数最多不会超过10次,

很好,问题又来了,在不允许乘除取模的情况下,如何获取高位?

卡住了。。。

我想了一种列出10,100,1000....位表的方法,通过对每一位反复减去对应位表的数的操作获取每一位的数字,可是这种方法实现起来细节太过繁琐了。

我看了一下discuss,他们用了一种类似进制转换的方法,用位操作代替了*2的操作,想法很好,

其实本质也是模拟除法,只不过它以除数为基,每次扩大为原来的两倍,精髓在于能想到位操作。

注意溢出的边界和中间变量的类型,已标在代码中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    int divide(int dividend, int divisor) {
        if(divisor==0 || (dividend == INT_MIN && divisor == -1)) return INT_MAX;//两种溢出的情况
        int flag1=dividend<0?-1:1,flag2=divisor<0?-1:1;
        int pre=flag1==flag2?1:-1;
        long long dividend2=flag1==1?dividend:-(long long)dividend; //转正数,int类型在INT_MIN值下会炸
        long long divisor2=flag2==1?divisor:-(long long)divisor;
        int result=0;
        while(dividend2>=divisor2) 
        {
            long long rm=divisor2,base=1;
            while(dividend2>=rm)
            {
                rm<<=1;
                base<<=1;
            }
            rm>>=1;
            base>>=1;
            dividend2-=rm;
            result+=base;
        }
        result=pre==1?result:-result; //符号
        return result;
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-09-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【leetcode】Divide Two Integers
Divide two integers without using multiplication, division and mod operator.
阳光岛主
2019/02/19
3740
【每日一题】29. Divide Two Integers
Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.
公众号-不为谁写的歌
2020/07/31
3450
[Leetcode]29. Divide Two Integers @python
Divide two integers without using multiplication, division and mod operator.
蛮三刀酱
2019/03/26
9450
LeetCode 0029 - Divide Two Integers
Divide two integers without using multiplication, division and mod operator.
Reck Zhang
2021/08/11
2520
LeetCode - #29 两数相除
我们社区陆续会将顾毅(**Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。微博:@故胤道长[1]**)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。
Swift社区
2022/04/04
5570
LeetCode - #29 两数相除
[Leetcode][python]Divide Two Integers
https://blog.csdn.net/qian2729/article/details/50528758
蛮三刀酱
2019/03/26
3970
LeetCode 29. Divide Two Integers
思路很简单。首先可以想到拿被除数减去除数,直到不能减为止。 但是这是很low的,我们可以用倍增的思想,任何数字都可以由2^x+2^y+2^z......组成的。
ShenduCC
2019/07/16
4220
Leetcode 题目解析之 Divide Two Integers
Divide two integers without using multiplication, division and mod operator.
ruochen
2022/01/15
1.3K0
LeetCode题目29:两数相除
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
二环宇少
2020/08/13
6480
LeetCode29 Medium 除法与二进制优化
Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.
TechFlow-承志
2020/03/05
6780
特殊的加法和除法(考察点为位操作符)
本篇为两道例题带你用位操作符完成取代加号和除号运算符,满满干活,细细解答,通俗易懂,浑然通透版本。
羑悻的小杀马特.
2025/01/23
600
特殊的加法和除法(考察点为位操作符)
Leetcode No.29 两数相除
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
week
2022/01/07
5670
LeetCode29. 两数相除
思路: 60/8 = (60-32)/8 + 4 = (60-32-16)/8 + 2 + 4 = 1 + 2 + 4 = 7
周杰伦本人
2022/10/25
4000
LeetCode 29. Divide Two Integers
Given two integers dividend and divisor, divide two integers without using multiplication, division, and mod operator.
Dylan Liu
2025/02/15
640
【leetcode 29】 两数相除(中等)
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
用户10384376
2023/02/26
4810
【leetcode 29】 两数相除(中等)
【力扣刷题】29. 两数相除
实现 strStr() 函数。 给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
jayjay
2022/11/02
6400
【力扣刷题】29. 两数相除
LeetCode 29. 两数相除(位运算)
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
Michael阿明
2020/07/13
8410
LeetCode 29. 两数相除(位运算)
leetcode-29. 两数相除
  根据题目的要求,我们先判断被除数是否为 0,若为 0 直接返回结果。由于 Integer.MIN_VALUE/-1 会导致溢出,因此价格判断,若遇到这种情况,则直接返回 Integer.MAX_VALUE。   设置一个正负标志位,假设为 true 则为负数。巧妙用被除数和除数的异或来与 0 比较,其实这个就单纯判断是否异号,跟异或本身运算结果没多大意义,这里选择异或运算符还是挺可以的。接下来将两个数强转为 long 型并取绝对值,为了防止溢出,用 long 类型来接收,再定义存储最终结果的变量。   接下来是一个 for 循环,几行代码,但是信息量挺大,功能很强,我赞叹这几行代码现在,一个字就是绝!这里是逆向思维:先把被除数左移 i 位,i 的值从 31 开始递减,当 被除数/2^i 的值刚好出现大于等于除数的时候,说明这时候要求的商已经出现,并且大于除数的部分就是余数。   这时候,2^i 就是商,但是此时循环要怎么退出来呢,比较好的方法就是控制被除数 d 的值,就是将除数 r 左移 i 位,然后被除数减去此时左移完数值跟被除数相近的除数的值,目的是用 d -= r << i 这个式子让 if 的条件 (d >> i) >= r 不满足,因为被除数 d 被减后的值再右移 i 位后肯定小于除数的(篇幅有限可自行证明,不难),for 也就执行到 i < 0 时成功退出。最后再根据上边 flag 的正负情况用三目表达式返回结果即可。非常巧妙,做题愉快!
灰太狼学Java
2022/10/27
8130
leetcode-29. 两数相除
☆打卡算法☆LeetCode 29、两数相除 算法解析
链接:29. 两数相除 - 力扣(LeetCode) (leetcode-cn.com)
恬静的小魔龙
2022/08/07
3720
☆打卡算法☆LeetCode 29、两数相除  算法解析
两数相除(leetcode29)
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
Vincent-yuan
2021/03/12
5940
相关推荐
【leetcode】Divide Two Integers
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档