LeetCode 29——两数相除
1. 题目

2. 解答
2.1. 方法一
题目要求不能使用乘法、除法和除余运算,但我们可以将除法转移到对数域。
\]
这样就转化为指数、对数和减法运算了。因为只能对正整数取对数,因此我们首先要将两个数都取绝对值,最后再加上符号。
同时,题目要求只能存储 32 位有符号整数,因此,当数据大于上边界时,需要进行特殊处理。
class Solution {
public:
int divide(int dividend, int divisor) {
if(dividend == 0) return 0;
double a = fabs(dividend);
double b = fabs(divisor);
long result = exp(log(a) - log(b));
if ((dividend < 0) ^ (divisor < 0)) result = -result;
if (result > INT_MAX) result = INT_MAX;
return result;
}
};
2.2. 方法二
利用移位操作。看下面的例子:
\]
\]
\]
我们可以对被除数进行分解。以 10 和 3 为例,首先我们确定 3 的最高次系数,\(10 > 3*2^1\) && \(10 < 3*2^2\),因此最高次系数为 2。然后我们用 10 减去 \(3*2^1\),继续进行刚才的过程,\(4 > 3*2^0\) && \(4 < 3*2^1\),2 的第二高次系数为 1。我们循环进行这个过程,直到最后的数小于除数为止,这些除数前面所有系数的和即为所求。
class Solution {
public:
int divide(int dividend, int divisor) {
long a = labs(dividend); // long 型数据占 8 个字节,labs() 函数对 long 求绝对值
long b = labs(divisor);
long temp = b;
long result = 0;
long cnt = 1;
while (a >= b)
{
cnt = 1;
temp = b;
while (a >= (temp << 1))
{
temp = temp << 1;
cnt = cnt << 1; // 表征除数前面的各次系数
}
a -= temp;
result += cnt;
}
if ((dividend < 0) ^ (divisor < 0)) result = -result;
if (result > INT_MAX) result = INT_MAX; // INT_MAX = 2^32 - 1
return result;
}
};
获取更多精彩,请关注「seniusen」!

LeetCode 29——两数相除的更多相关文章
- Java实现 LeetCode 29 两数相除
29. 两数相除 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商 ...
- Leetcode 29.两数相除 By Python
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...
- LeetCode 29 - 两数相除 - [位运算]
题目链接:https://leetcode-cn.com/problems/divide-two-integers/description/ 给定两个整数,被除数 dividend 和除数 divis ...
- 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 ...
- 【剑指 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 ...
随机推荐
- linux 学习(二)防火墙
ubuntu 第四 防火墙 安装 sudo apt-get install ufw 启用 sudo ufw enable 拒绝所有 sudo default deny 开启端口 sudo ufw al ...
- 跨Vlan通信:单臂路由,三层交换机
实验涉及命令以及知识补充(涉及Vlan通过的以太网口需要设置为Trunk口) 单臂路由 父接口 no ip address :删除实现单臂路由接口的IP no shutdown 虚拟子接口 R2(co ...
- iOS之点击通知栏跳转应用的相关页面
当远程推送通知到达应用,有3个相关的方法是用来处理这个通知的. - (BOOL)application:(UIApplication *)application didFinishLaunchingW ...
- Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate failed: Exception getting JDBC Driver: com.mysql.jdbc.Driver (mybatis逆向工程)
springboot整合mybatis时出现的问题 解决方法:在pom.xml中plugin中加入单独依赖Mysql驱动包,问题便可解决 <plugin> <groupId>o ...
- 简单使用PuTTy登录centos虚拟机
博主刚刚开始学习Linux,想通过写博客的方式加深对linux学习的记忆 使用虚拟机安装精简版的linux后发现窗口字体太小,于是就想着通过PuTTy登录的方式解决 简单安装linux后 将linux ...
- javascript--setTimeout定时器
setTimeout() 可以理解为 定时炸弹 ---------------->隔一段事件执行,并且只会执行一次 函数语法: setTimeout(参数1,参数2) 参数1:待执行 ...
- 使用jQuery实现数字逆时针旋转
要实现数字逆转,最主要是分析我们页面的元素结果,结合选择器充分利用起来! 例如:以下lable中每一个id和值的安排具有一定结构的意义需要用心分析: jQuery代码:
- nginx 只允许域名访问,禁止IP访问
在nginx中为了防止,通过ip地址或者没有备案的域名代理到nginx上,可以在nginx中配置来阻止这一操作 #只可以用域名访问(此处的server是新增,并不是在原有的server基础上修改),默 ...
- 微信小程序scroll-viwe遇到的问题
1.当使用scroll-view的时候里面不可以使用某些标签 2.当使用scroll-view的时候会出现,子元素中滑动的时候会出现滚动的情况,我遇到的是因为view设置了高度和行高,一旦设置了这个, ...
- [BZOJ2809][Apio2012]dispatching(左偏树)
首先对于一个节点以及它的子树,它的最优方案显然是子树下选最小的几个 用左偏树维护出每棵子树最优方案的节点,记录答案 然后它的这棵树可以向上转移给父节点,将所有子节点的左偏树合并再维护就是父节点的最优方 ...