题目链接:https://leetcode-cn.com/problems/divide-two-integers/description/

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

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

示例 1:

输入: dividend = $10$, divisor = $3$
输出: $3$

示例 2:

输入: dividend = $7$, divisor = $-3$
输出: $-2$

说明:

被除数和除数均为 32 位有符号整数。
除数不为 $0$。
假设我们的环境只能存储 $32$ 位有符号整数,其数值范围是 $[-2^{31}, 2^{31} - 1]$。本题中,如果除法结果溢出,则返回 $2^{31} - 1$。

题解:

首先, 知道除数不为零,那么溢出唯一的可能就是 $-2^{31} \div (-1) = 2^{31}$,把这个情况特判掉。再特判掉被除数为零的情况。

那么剩下来,被除数和除数都不为零,可以统一先变成两个正数相除。

由于不允许使用乘除模,首先最简单的,就是考虑累减,不过这题卡掉了累减的做法,考虑类似于快速幂那样的思路。

任何被除数 $a$,对于除数 $b$,均可以表示为  $a = (2^{k_1} + 2^{k_2} + \cdots + 2^{k_n})b + r$,其中 $r = a \bmod b$。相应的 $a / b = 2^{k_1} + 2^{k_2} + \cdots + 2^{k_n}$。

只要用左移和右移代替乘 $2$ 和除 $2$,然后找出 $k_1 \sim k_n$ 即可。

AC代码:

static const auto io_sync_off = []()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
struct Solution
{
inline long long _abs(long long x){return x<?-x:x;}
int divide(int dividend, int divisor)
{
if(dividend==- && divisor==-) return ;
if(dividend==) return ;
long long f=, a=dividend, b=divisor;
if((a< && b>) || (a> && b<)) f=-;
a=_abs(a), b=_abs(b); long long res=, t=;
while(a>b) b<<=, t<<=;
while(a>=_abs(divisor))
{
while(a<b) b>>=, t>>=;
a-=b, res+=t;
}
return f==-?-res:res;
}
};

LeetCode 29 - 两数相除 - [位运算]的更多相关文章

  1. Java实现 LeetCode 29 两数相除

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

  2. Leetcode 29.两数相除 By Python

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

  3. leetcode 29 两数相除

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

  4. [LeetCode]29 两数相除和一个小坑点

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

  5. leetcode 29两数相除

    我理解本题是考察基于加减实现除法,代码如下: class Solution { public: //只用加减号实现除法, //不用加减号实现除法: int divide(int dividend, i ...

  6. LeetCode 29——两数相除

    1. 题目 2. 解答 2.1. 方法一 题目要求不能使用乘法.除法和除余运算,但我们可以将除法转移到对数域. \[ \frac{a}{b} = e^{\frac{lna}{lnb}} = e^{ln ...

  7. 【剑指 Offer II 001. 整数除法】同leedcode 29.两数相除

    剑指 Offer II 001. 整数除法 解题思路 在计算的时候将负数转化为正数,对于32位整数而言,最小的正数是-2^31, 将其转化为正数是2^31,导致溢出.因此将正数转化为负数不会导致溢出. ...

  8. [LeetCode] 29. Divide Two Integers 两数相除

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...

  9. LeetCode(29): 两数相除

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

随机推荐

  1. MongoDB中MapReduce介绍与使用

    一.简介 在用MongoDB查询返回的数据量很大的情况下,做一些比较复杂的统计和聚合操作做花费的时间很长的时候,可以用MongoDB中的MapReduce进行实现 MapReduce是个非常灵活和强大 ...

  2. cmd adb批量安装与卸载

    批量安装: SET dir=%~dp0echo dir is: %dir%cd /d %dir%for /R %dir% %%i in (*.apk) do adb install %%i 批量卸载: ...

  3. 【Linux】linux/unix下telnet提示Escape character is '^]'的意义

    在linux/unix下使用telnet hostname port连接上主机后会提示Escape character is '^]' 这个提示的意思是按Ctrl + ] 会呼出telnet的命令行, ...

  4. CSS3 选择器 基本选择器介绍

    CSS是一种用于屏幕上渲染html,xml等一种语言,CSS主要是在相应的元素中应用样式,来渲染相对应用的元素,那么这样我们选择相应的元素就很重要了,如何选择对应的元素,此时就需要我们所说的选择器.选 ...

  5. 2013-2015 Aaronyang的又一总结,牧童遥指纳尼村

    我没有时间去唠叨自己的事,可是你们是我喜欢的人,ay很愿意写给你们分享:去年的万人阅读的总结链接:<没学历的IT人生没那么悲催,献给程序员们> 提前声明:本文不良反应:请自备垃圾桶,准备装 ...

  6. 三星S4 i9508 4.4.2 root 教程

    现在有很多一键root的软件,但是各怀鬼胎,最好不用. 最近玩腻了三方的rom,刷回了官方的rom,顿时更稳定了,以外的是这个版本的导航被切了,拍手叫好啊.输入法引入了搜狗的云输入,更方便了,官方的输 ...

  7. Features Download Pricing Mind Maps Blog XMind的快捷键

    XMind提供很多快捷键.使用XMind时,在操作的过程中结合快捷键,双手同时操作,将给你带来很大的便利.例如下面一些常用的快捷键: 编辑主题:F2 添加标签:F3 创建一个新的空白工作簿:Ctrl+ ...

  8. python 图片上添加文字

    import PIL from PIL import ImageFont from PIL import Image from PIL import ImageDraw #设置字体,如果没有,也可以不 ...

  9. Scala学习笔记——断言和单元测试

    1.断言 assert(conditon)将在条件不成立的时候,抛出assertionError assert(conditon,explanation)讲在条件不成立的时候,抛出explanatio ...

  10. 【DL】梯度下降小结

    温故知新 https://www.cnblogs.com/pinard/p/5970503.html