当前位置: 首页 > 后端技术 > Python

LeetCode29.两个数相除

时间:2023-03-26 00:41:33 Python

29。两个数相除题目来源:https://leetcode-cn.com/problems/divide-two-integers题目给定两个整数,被除数被除数divisor。两个数相除,不需要乘法、除法和模运算符。返回股息除以除数divisor得到的商。整数除法的结果应截断(truncate)其小数部分,例如:truncate(8.345)=8andtruncate(-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。解题思路:递归本文采用了递归的方法。递归层数之所以能继续递归不抛异常,是因为内部先进行了倍增计算。如果倍增的结果大于被除数,则进行下一级递归,详见下文代码实现部分。算法:处理特殊情况:1.如果被除数为0,则返回0;2.如果除数为1,返回被除数;计算时,将被除数和除数都转换成正数进行计算(用符号标出原被除数和除数符号的商,最后返回结果后判断)边界情况处理:当商为正数时:这里需要区分一下,如果商大于INT_MAX,则返回INT_MAX;否则,返回ans。(这是因为只有同号的时候可能会溢出,被除数和被除数都是负号)当商为负数时:这里直接返回-ans(上面说了计算是把被除数都转换了和除数变成正数)做除法:其实主要是转换成加减法;count统计次数,除数翻倍累加。比较双重累加的结果;具体看下面的例子:假设dividend=10,divisor=3:Precondition:dividend>divisorsetcount=1开始统计,将除数复制到另一个变量,同时累加一倍,从3到6。这里6小于dividend被分红,所以计数也可以加倍累加成为2;再说一遍,这时候6翻了一倍变成了12,而12比被除数还大,所以这个累加就不算了。于是用被除数减去最后一个除数的累加结果,即6,剩下4,进入下一个递归;此时被除数变成4,原来的除数还是3,满足前提条件。重复上面的操作,因为除数累加结果6还是大于4,所以此时被除数还是减去除数,计数并没有变成1。此时被除数为1,除数为3、不满足前置条件,直接返回0。count逐层递归返回累加结果,最终值为2+1=3。这部分代码实现如下(m:表示被除数;n:表示除数):defdiv(m,n):ifmint:defdiv(m,n):ifm0anddividend<0)or(divisor<0anddividend>0):sign=-1m=dividendifdividend>0else-dividendn=divisorifdivisor>0else-divisorans=div(m,n)#这里表示被除数和除数同号的情况#但是如果都是负数,可能会出现边界问题#所以需要判断here如果符号>0结果是否溢出:returnansifans