LeetCode 29 - 两数相除 - [位运算]
题目链接: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 - 两数相除 - [位运算]的更多相关文章
- Java实现 LeetCode 29 两数相除
29. 两数相除 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商 ...
- Leetcode 29.两数相除 By Python
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...
- leetcode 29 两数相除
问题描述 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 ...
- [LeetCode]29 两数相除和一个小坑点
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...
- leetcode 29两数相除
我理解本题是考察基于加减实现除法,代码如下: class Solution { public: //只用加减号实现除法, //不用加减号实现除法: int divide(int dividend, i ...
- LeetCode 29——两数相除
1. 题目 2. 解答 2.1. 方法一 题目要求不能使用乘法.除法和除余运算,但我们可以将除法转移到对数域. \[ \frac{a}{b} = e^{\frac{lna}{lnb}} = e^{ln ...
- 【剑指 Offer II 001. 整数除法】同leedcode 29.两数相除
剑指 Offer II 001. 整数除法 解题思路 在计算的时候将负数转化为正数,对于32位整数而言,最小的正数是-2^31, 将其转化为正数是2^31,导致溢出.因此将正数转化为负数不会导致溢出. ...
- [LeetCode] 29. Divide Two Integers 两数相除
Given two integers dividend and divisor, divide two integers without using multiplication, division ...
- LeetCode(29): 两数相除
Medium! 题目描述: 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor ...
随机推荐
- PC端和移动端在前端开发上的一些区别,前端里移动端到底比pc端多哪些知识
(1)———————— 前端里移动端到底比pc端多哪些知识,为啥面试时好多公司都问h5水平如何?我做过几年的web前端开发,就简单谈谈自己的感受吧.首先来看看PC端和移动端在前端开发上的一些区别: ( ...
- java 代码的良好习惯
有很多书籍提到了代码开发的良好习惯,但是自己看过后,在开发中并不能每次都想起来.在此处开贴做笔记,以后自己开发的代码,必须符合. 不要在一个代码块的开头把局部变量一次性都声明了(这是c语言的做法),而 ...
- [svc]openssl对称非对称加密实战
OpenSSL进行aes加密解密-对称加密(symmetry) 建立文件test.txt, 特意写入中英文 # cd /tmp # echo "test测试" > test. ...
- CodeIgniter中使用CSRF TOKEN的一个坑
事情的经过是这样的,一个自动化扫描工具说我的代码中存在XSS漏洞,什么是XSS不懂的朋友可以看这里 我的代码里面开启CodeIgniter框架的CSRF Token,如下: 很简单,更多详情参考CI官 ...
- audio video 控制播放和停止
<audio id="audio" src="waring.wav" preload="auto" controls loop> ...
- unable to locate package gparted
在unbuntu安装gparted的时候出现这个错误提示,意思为:找不到这个安装包 可能的原因: 1.当前系统更新包没有更新,执行命令:sudo apt-get update 2.命令错误,重新检查需 ...
- 【转】Web前端性能优化——如何提高页面加载速度
前言: 在同样的网络环境下,两个同样能满足你的需求的网站,一个“Duang”的一下就加载出来了,一个纠结了半天才出来,你会选择哪个?研究表明:用户最满意的打开网页时间是2-5秒,如果等待超过10秒, ...
- C# 内存理论与实践
The C# Memory Model in Theory and Practice Best Practices All code you write should rely only on the ...
- oracle函数详解-转
1.SQL 语句基础 下面给出SQL语句的基本介绍. 1.1.SQL语句所用符号 操作符 用途 例子 + - 表示正数或负数,正数可省去 + -1234.56 + 将两个数或表达式进行相加 A=c+b ...
- win7下安装Office2010老是出现提示安装MSXML6.10.1129.0,下载官方MSXML后提示安装成功却也安装不了
在注册表中增加以下信息: [HKEY_CLASSES_ROOT\TypeLib\{F5078F18-C551-11D3-89B9-0000F81FE221}][HKEY_CLASSES_ROOT\Ty ...