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 ...
随机推荐
- Webpack学习笔记九 webpack优化总结
webpack 优化笔记 webpack4 自带的优化包括 swingTree(摇摆树)和作用域提升 swingTree 比如入口文件 index.js引入通用方法 util, 里面有 10个方法, ...
- 魔板 Magic Squares(广搜,状态转化)
题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜 ...
- jenkins部署记录
环境规划 主机分配 192.168.2.139 : gitlab 192.168.2.141 : jenkins 192.168.2.142 : haproxy01 192.168.2.143 :ha ...
- 关于Linux环境变量DISPLAY的设置
问题描述:在个人PC(windows系统)安装了虚拟机,虚拟机中安装了Linux系统,Linux系统中安装了wireshark和firefox这两个程序,网上查阅可以通过设置DISPLAY环境变量指向 ...
- Django---定义、MVC和MTV模式、命令行工具、配置文件settings
1.什么是web框架 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. 对于所有的 ...
- python pandas库——pivot使用心得
python pandas库——pivot使用心得 2017年12月14日 17:07:06 阅读数:364 最近在做基于python的数据分析工作,引用第三方数据分析库——pandas(versio ...
- mysql中tinyint、smallint、mediumint,int 和bigint 的区别
1:字节的定义:字节(Byte):字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位. 一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间 2.在mysql中一个汉字占三个 ...
- C# 生成机器码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- java泛型<? extends E> 有上限通配符与<? Super E>有上限通配符
通配符?,?表示占位,表明将来使用的时候在指明类型 <?>无限定的通配符, 是让泛型能够接受未知类型的数据 <? extends E> 有上限通配符,能够接受指定类及其子类类型 ...
- go学习笔记-基础类型
基础类型 布尔值 布尔值的类型为bool,值是true或false,默认为false. //示例代码 var isActive bool // 全局变量声明 var enabled, disabled ...