29. Divide Two Integers(两数相除)两种解法(C++ & 注释)

告别SquareLine!用免费的NXP GUI-Guider为海思3516AV300开发LVGL界面(附完整移植流程) 本文详细介绍了如何利用免费的NXP GUI-Guider工具为海思Hi3516AV300开发LVGL界面,包括环境配置、代码移植和性能优化等全流程实战指南。特别针对二维码组件缺失等常见问题提供解决方案,帮助开发者零成本构建高效嵌入式GUI系统。 阅读详情

1. 题目描述

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

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

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

示例 1:

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333…) = truncate(3) = 3

示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = truncate(-2.33333…) = -2

提示:

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

题目链接:中文题目;英文题目

2. 减法(Subtraction, Time Limit Exceeded)

2.1 解题思路

最简单的思路就是:被除数每减去一次除数,计数加一,当被除数小于0的时候,根据被除数和除数的符号返回总计数即可。只是需要考虑一个很极端的情况:

被除数:INT_MIN,除数:-1

这种情况的结果是INT_MAX + 1,明显超过了整型能表示的最大值,所以这里需要额外判断一下。但是这个方法当被除数很大,除数很小的时候,比如刚才的例子,非常的耗时,所以超时了。

2.2 实例代码

class Solution {
public:
    int divide(int dividend, int divisor) {
        bool minusOne = dividend >= 0 ? false : true, minusTwo = divisor >= 0 ? false : true;
        long long dividendTemp = dividend, divisorTemp = divisor;
        if (dividendTemp < 0) dividendTemp = -dividendTemp;
        if (divisorTemp < 0) divisorTemp = -divisorTemp;

        long long count = 0;
        while (dividendTemp >= 0) { count++; dividendTemp -= divisorTemp; }

        count--;
        if (minusOne && minusTwo || !minusOne && !minusTwo) {
            if (count >= INT_MAX) return INT_MAX;
            else return count;
        }
        return -count;
    }
};

3. 位操作(Bit Manipulation)

3.1 解题思路

上面的思路中是一个个地减去除数,如果想要节约时间,能不能一次性减去多个除数呢?也就是减去除数的倍数,但是题目要求不能使用乘法、除法和模运算,所以我们可以考虑使用位运算(左位移和右位移):

  1. 整型左位移1位,相当于原数 /= 2;并且移动的时候,最低位舍弃,负数最高位补1,正数最高位补0;
  2. 整型右位移1位,相等于原数 *= 2;并且最低位补0,最高位舍弃;

比如1二进制表示为0001(省略前面的0),左位移一位变成0000 = 0,右位移一位变成0010 = 2。比如-1二进制表示为1111(省略前面的1),左位移一位不变还是1111 = -1,右位移一位变成1110 = -2;

所以我们可以利用左位移的特性,让被除数减去偶数倍的除数,操作步骤如下:

  1. 初始化一个新的被除数(dividendTemp),一个新的除数(divisorTemp ),一个答案(ans),一个倍数(times)。
  2. 并且dividendTemp和divisorTemp 需要绝对值一下,保证计算时都是正数;
  3. 然后判断一下结果是复数还是正数;
  4. 如果除数是1,根据符号直接返回dividendTemp即可;
  5. 接下来,判断一下dividendTemp是不是大于两倍的divisorTemp (divisorTemp << 1),如果是divisorTemp扩大两倍,times也扩大两倍;一直重复这一步直到dividendTemp不在大于两倍的divisorTemp,跳出循环的时候ans += times;
  6. 接下来,判断一下dividendTemp是不是大于等于divisorTemp。如果是只需要ans += 1即可,因为这时dividendTemp最多只比divisorTemp大一倍
  7. 当dividendTemp < divisorTemp,已经做完除法,根据符号返回ans即可;

举个例子:dividendTemp = 14,divisorTemp = 3。14大于两倍的3(= 6),也大于两倍的6(= 12),所以14 - 12 = 2 < 3,循环结束,我们返回4即可。

其实这个思路可以理解成用除数的偶数倍来做除法,最后返回的答案就是除数是被除数的多少倍。当我们保证被除数不大于两倍的除数,这时被除数要么小于除数,直接舍去结果即可(因为整型计算,没有小数);被除数要么等于大于一倍的除数,小于两倍的除数,这时结果再加一即为最终结果。

3.2 实例代码

3.2.1 迭代实现

class Solution {
public:
    int divide(int dividend, int divisor) {
        if (dividend == INT_MIN && divisor == -1) return INT_MAX;
        long dividendTemp = labs(dividend), divisorTemp = labs(divisor), ans = 0;
        bool ifPositive = (dividend < 0) ^ (divisor < 0) ? false : true; // 结果是正数还是负数,异或运算:相同为0,不同为1
        if (divisorTemp == 1) return ifPositive ? dividendTemp : -dividendTemp;
        while (dividendTemp >= divisorTemp) {
            long divisorMultiply = divisorTemp, times = 1;
            while (dividendTemp >= divisorMultiply << 1) {
                divisorMultiply <<= 1;
                times <<= 1;
            }

            ans += times;
            dividendTemp -= divisorMultiply;
        }

        return ifPositive ? ans : -ans;
    }
};

3.2.2 递归实现

class Solution {
public:
    int divide(int dividend, int divisor) {
        long dividendTemp = labs(dividend), divisorTemp = labs(divisor);
        if (dividendTemp < divisorTemp) return 0;
        long divisorMulply = divisorTemp, times = 1, ans = 0;
        while (dividendTemp > (divisorMulply << 1)) { divisorMulply <<= 1; times <<= 1; }
        ans += times + divide(dividendTemp - divisorMulply, divisorTemp);
        if ((dividend < 0) ^ (divisor < 0)) ans = -ans;
        return ans >= INT_MAX ? INT_MAX : ans;
    }
};

4. 参考资料

  1. [LeetCode] 29. Divide Two Integers 两数相除
  2. C 库函数 - labs()
  3. abs
  4. labs
  5. 负数的位运算问题
  6. 位运算(&、|、^、~、>>、<<)

在这里插入图片描述

ROSTEA软件下载及情感分析详细操作教程(附网盘链接) 原ROST虚拟团队出品的ROST系列文本内容挖掘分析平台,是辅助人文社会科学研究的免费计算平台。该软件可以实现文本预处理、分字、分词、词性识别、特殊名词抽取、词频统计、英文词频统计、情感计算、分类算法、聚类算法等一系列文本挖掘,是人文社科研究和论文写作的一把利器。该软件用户量超过一万人,遍布海内外100多所大学,包括剑桥大学、日本北海道大学、北京大学、清华大学、香港城市大学、澳门大学等众多高校。关于ROSTCM6的安装介绍可以参考之前的文章ROSTCM6软件下载及语义网络分析详细操作教程ROST EA。 阅读详情

相关推荐

实战演练 | ABAQUS显式动力学分析在金属切削仿真中的应用

本文详细介绍了如何利用ABAQUS显式动力学分析进行金属切削过程的二维仿真。通过从零开始的完整流程,包括几何建模、材料本构与失效定义、网格划分、接触设置、边界条件施加,到结果后处理与切削力提取,为工程师和研究人员提供了实用的仿真方法,以优化刀具设计和加工工艺。

purple的博客 930

C++的除法

C++除法分为两种情况,一种是整型之间的除法,一种是浮点数之间的除法 对于整型之间的除法(int),除法的结果只会保留商的整数部分,如下面: int x = 356; cout &lt;&lt;x/100&lt;&lt; endl; //输出3 对于浮点数之间的除法(float,double),除法的结果会保留小数部分,如下面: float x = 356; cout &lt;&...

Mr.horse的博客 4万+

ilqr算法原理推导及代码实践

ilqr算法原理详解

Forwarding3的博客 1741

Divide Two Integers(两个整数相除)

//参考derrantcm的博客,网址:https://blog.csdn.net/DERRANTCM/article/details/47052683 package algorithm; /* *https://blog.csdn.net/DERRANTCM/article/details/47052683 * 2个整数相除,不使用除法,乘法,取余 原题   Divide two i...

zyzn1425077119的博客 808

手把手教你用Matlab解析Zygo .dat文件:从二进制数据到面形图(附完整流程)

本文详细介绍了如何使用Matlab解析Zygo干涉仪生成的.dat文件,从二进制数据读取到面形图可视化的完整流程。通过实例代码演示了文件结构解析、数据矩阵读取、高阶Zernike拟合等关键技术,帮助工程师和研究人员高效处理光学检测数据,提升分析精度和工作效率。

weixin_30731305的博客 449

相位相关匹配法的opencv C++实现

这一段就是PCIAM算法的核心了,计算两幅图像的峰值相关矩阵,也是完全按照matlab移植过来的,但是后面几行,是为了筛选一些不可能存在的情况,比如边缘处的完全重合,或者只有一行,或者一列重合等等情况,由于PCIAM算法在边缘处的响应值高,所以在一些场景下可能是一种干扰,所以进行了剔除,当然可以不剔除,就是对后期的峰值选取会有影响。头文件,以及各类函数,还有主函数,第一次独立的写这种分文件类型的项目,写的拉跨还请包涵,以及当然可以转成类的形式,但感觉有点小麻烦,后期再修改吧。

qq_43616651的博客 4263

两个int相除

需要注意的是,除法运算可能会产生截断误差,因此结果可能不是精确的。如果需要精确的除法运算,应该将其中一个操作数转换为浮点数,然后使用浮点数的除法运算符。在此示例中,将变量a强制转换为double类型,然后进行除法运算。由于c被声明为double类型,因此除法运算的结果将是一个具有高精度的小数。运算符进行除法运算。如果两个整数想除,可以使用C++中的除法运算符。如果两个整数都是int类型,则用。

weixin_38901152的博客 2878

计量经济学——事件研究法/事件分析法

计量经济学——事件研究法/事件分析法

weixin_46189461的博客 6752

Divide Two Integers 的两种解法

Divide two integers without using multiplication, division and mod operator. If it is overflow, return MAX_INT. 解题思路: 1. 通过被除数减去除数来得到被除数中包含多少个除数,一直减到被除数小于等于 0 则计算完成; 2. 如果是一个很大的被除数除以很小的除数,那么必然

u010097581的博客 762

HFSS实战项目——GPS北斗双模微带天线

本文设计了一款方形圆极化微带天线应用于北斗B1和GPSL1频段,满足高增益、低VSWR、适当方向图等要求。设计中心频率为1568MHz,介质板采用厚度h=1.6mm的Arlon AD450(tm)板,相对介电常数为4.5,采用探针馈电。

2401_87464239的博客 1767

多物理场光学仿真软件:COMSOL_(10).激光器与谐振腔仿真

定义Nd:YAG晶体的材料属性% 折射率% 吸收系数% 发射截面% 定义光泵浦源% 泵浦光波长% 泵浦光强度% 泵浦光方向% 定义全反射镜% 选择边界% 完美电导体边界条件% 定义部分反射镜% 选择边界% 反射率边界条件% 反射率通过 COMSOL 对激光器和光学谐振腔进行仿真,可以全面评估激光器的性能,包括输出功率、效率、稳定性和模式选择等。这些仿真结果为激光器的设计和优化提供了重要的参考依据。

kkchenjj的博客 1649

C++11 整型的算术运算

C++11 中的整型取余和取模操作

Frank的专栏 5121

Altium Designer应用技巧1: 功能模块的复用方法

Altium Designer应用技巧1: 功能模块的复用方法      我们在使用Altium Designer进行电路图设计时,常会遇到功能模块的复用问题,例如我们经常需要将12V以DC-DC的方式转换成5V,这在很多线路板上都会应用到。现在我们普通的做法是,每个板子都重新绘制一遍,像这样DC-DC的电路,很浪费时间。那么如何采用提高工作效率呢?我们可以采取Altium Desi

snmplink的博客 1万+

LeetCode(29)Divide Two Integers

题目内容 Divide two integers without using multiplication, division and mod operator. 题目分析 最容易的想到的办法,是把除法转化为减法,就像把乘法转化为加法一样,提交后发现,这个做法超时了,比如遇到2147483647/3这种时候,基本只能超时。所以应该要使用一个特别的方法来提高效率。我想应该是位运算了。但是不

BUILD 4357

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

leetcode 29. Divide Two Integers(两个数相除)

Given two integers dividend and divisor, divide two integers without using multiplication, division, and mod operator. The integer division should truncate toward zero, which means losing its fractional part. For example, 8.345 would be truncated to 8, and

蓝羽飞鸟的博客 344

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

29. Divide Two Integers(两数相除)————附带详细代码和思路

文章目录0 结果![请添加图片描述](https://img-blog.csdnimg.cn/0de24c78ce004b2bbb36a90700294115.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA57mB5pif6JOd6Zuo,size_20,color_FFFFFF,t_70,g_se,x_16)1 题目2 思路2.1 思路12.2 思路23 代码3.1 思路13.2 思路二 0 结果

韩江雪de 小屋 802

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

29. Divide Two Integers

29. 两数相除 给定两个整数,被除数dividend和除数divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数dividend除以除数divisor得到的商。 示例1: 输入: dividend = 10, divisor = 3 输出: 3 示例2: 输入: dividend = 7, divisor = -3 输出: -2 说明: 被除数和...

GGGGITFKBJG的主页 208

leetcode-top150-29. Divide Two Integers 两数相除

给定两个整数 dividend 和 divisor ,在不使用乘法、除法和取模运算符的情况下,对两个整数进行除法运算。整数除法应向零截断,这意味着丢失其小数部分。例如, 8.345 将被截断为 8 ,而 -2.7335 将被截断为 -2。将 dividend 除以 divisor 后返回商。1、选一数位,于此数位上以数字1~9乘除数,使之最接近被除数;2、做差,差作为新被除数,再进行下一数位之操作。涉及两个挑战,一是超时问题,二是边界条件。时值最小,故最优进制应是3。,原想法的计算复杂度是。

yexingzhe2018的博客 1231

[详细思路]如何用C++通过位运算实现int整数的加减乘除运算

如何只通过位运算实现int整数的加减乘除运算,不使用+-*/%等直接的运算符和库。从加法开始,详细讲解。

tunmang5421的博客 3338

Divide Two Integers

一. Divide Two IntegersDivide two integers without using multiplication, division and mod operator.If it is overflow, return MAX_INT.Difficulty:MediumTIME:TIMEOUT解法实现整数的除法,不能用乘法除法以及取余。因此就剩下加减法,用加减法当然可以,

u014652699的专栏 382

两个integer进行除法操作,得到小数

package com.lysf.project.ilab.utils; import java.math.BigDecimal; public class DoubleUtils { public static double deciMal(int top, int below) { double result = new BigDecimal((float)top / below).setScale(4, BigDecimal.ROUND_HALF_UP).double.

qq_40180411的博客 4680

C++:加减乘除运算符(14)

就是常用的一些算数符乘。

鲍海超 992

c++格式控制

1. 两个int型相除要得到double int a=3; int b=2; double c=a/b; 结果c=1; 事实上/是取余。 如何得到double或float型呢。 方法1:(隐式转化) int a=3; int b=2; double c=a*1.0/b; 结果c=1.5 因为数据类型沿着低级向高级转化,一旦出现高级类型,数据运算过程都是转化成最高级的类型

u013497977的专栏 1444

两个int类型的除法和取模运算

1.两个int类型的除法     两个int类型相除的结果还会是int类型,因此除不尽结果也不会出现小数,而且结果也不是数学上的四舍五入。相对于数学上的结果不管是正负靠近0的那个整数就是两个int类型相除的结果,如数学上的结果是3.9,那么结果就是3(3比4更靠近0)。数学上的结果是-3.9,那么结果就是-3(-3比-4更靠近0)。 2.两个int类型的取模运算     两个int类型取模的

interperson的专栏 1万+

C++ int 型负数除法与求模运算

C++ int 型负数除法与求模运算        一、结论:        1、除法运算:向零取整(向0方向取最接近精确值的整数,类比向上取整和向下取整);        比如:10/(-4) = -2;10/4 = 2;        2、求模运算: (1) |小| % |大| = |小| ,符号同前; (2) |大 | % |小| = |余| ,符号同前; (|n|

Sean 1万+
上一篇: 24. Swap Nodes in Pairs(两两交换链表中的节点)解法(C++ & 注释)
下一篇: 31. Next Permutation(下一个排列)解法(C++ & 注释)
fengkeyleaf
博客等级 码龄7年 266粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值