【LeetCode每天一题】Divide Two Integers(两整数相除)

Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.

Return the quotient after dividing dividend by divisor.

The integer division should truncate toward zero.

Example 1:             Input: dividend = 10, divisor = 3                Output: 3

Example 2:             Input: dividend = 7, divisor = -3                Output: -2

Note:

  • Both dividend and divisor will be 32-bit signed integers.
  • The divisor will never be 0.
  • Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231,  231 − 1]. For the purpose of this problem, assume that your function returns 231 − 1 when the division result overflows.

思路



  在题中明确了不能使用乘法和除法以及模运算,所以我们只能通过其他办法来进行解决。除法解决的问题就是看被除数里面有多少个除数的问题,最简单的方法就是我们可以使用减法,对被除数减去除数,然后计数加一。但是这种办法当从被除数较大时时间复杂度较高,因此我们可以对其进行改进,对被除数从除数的倍数开始减去,然后每次相减完毕之后对对除数进行加倍。这样当被除数比较大时,也能很快的相减完毕。

解决代码


 1 class Solution(object):
 2     def divide(self, dividend, divisor):
 3         positive = (dividend < 0) is (divisor < 0)  # 被除数和除数为负数的情况进行考虑。
 4         dividend, divisor = abs(dividend), abs(divisor)    # 对其取绝对值
 5         res = 0                                     # 结果
 6         while dividend >= divisor:                 #  当被除数小于当前除数时,说明已经不能被整除了。
 7             tem, i = divisor, 1                  # 存储倍数和除数
 8             while dividend >= tem:              # 当被除数小于当前倍数除数时,终止循环
 9                 dividend -= tem                  # 被除数减去除数
10                 res += i                         # 结果加上相应的倍数
11                 i <<= 1                          # 除数的倍数
12                 tem <<= 1                        # 除数翻倍
13         if not positive:                       # 判断是否有负数
14             res = -res
15         return min(max(-2147483648, res), 2147483647) # 超出范围判断

原文地址:https://www.cnblogs.com/GoodRnne/p/10664470.html

时间: 2024-08-07 21:17:35

【LeetCode每天一题】Divide Two Integers(两整数相除)的相关文章

leetCode 29.Divide Two Integers (两整数相除) 解题思路和方法

Divide Two Integers Divide two integers without using multiplication, division and mod operator. If it is overflow, return MAX_INT. 思路:这个题算法上不是很难,但是通过率相当低,只有15%,果然,自己在写完之后,各种出错,而且错误不是算法上的错误,是各种边界值没有考虑到,很多溢出错误等.下面是具体代码,有详细注释. public class Solution { p

leetcode第28题--Divide Two Integers

Divide two integers without using multiplication, division and mod operator. 分析:题目意思很容易理解,就是不用乘除法和模运算求来做除法,很容易想到的一个方法是一直做减法,然后计数,超时.在网上找到一种解法,利用位运算,意思是任何一个整数可以表示成以2的幂为底的一组基的线性组合,即num=a_0*2^0+a_1*2^1+a_2*2^2+...+a_n*2^n.基于以上这个公式以及左移一位相当于乘以2,我们先让除数左移直到

[LintCode] Divide Two Integers 两数相除

Divide two integers without using multiplication, division and mod operator. If it is overflow, return 2147483647 Have you met this question in a real interview? Example Given dividend = 100 and divisor = 9, return 11.

lintcode 中等题:Divide Two Integers 两个数的除法

题目 两个整数相除 将两个整数相除,要求不使用乘法.除法和 mod 运算符. 如果溢出,返回 2147483647 . 样例 给定被除数 = 100 ,除数 = 9,返回 11 解题  15%的通过率,减法,位运算?表示不知道如何下手. 法一:利用减法,超时,人工直接去除的一些情况太流氓. public class Solution { /** * @param dividend the dividend * @param divisor the divisor * @return the re

Java两整数相除保留两位小数

在Java中 两个整数相除 会做取整运算,此时如果希望得到运算结果为浮点数 则必须将两整数其一或两者都强制转为为浮点数 例如: int a = 9; int b = 2; System.out.println((float)a/b); System.out.println(a/(float)b); System.out.println((float)a/(float)b); 保留两位小数 DecimalFormat df = new DecimalFormat("0.00"); Str

C语言中,两整数相除,若分母为零,则会出现怎样的结果???

1==首先编译的时候会给出如下warning:warning: division by zero. 然后运行时如果是"3.0 / 0"这样的(floating),会给出inf: 如果是"3 / 0"这样的(integer),会给出Floating point exception. 2==在vc中用F5执行会弹出一个对话框,内容为:Unhandled exceptiong in xxx.exe:0xC0000094:Integer Divide by Zero用ctr

不使用运算符 /号实现两整数相除

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp2 { class Program { static void Main(string[] args) { Console.WriteLine(div(1888888888,5)); Console.Read(); } ///

[Leetcode][Python]29: Divide Two Integers

# -*- coding: utf8 -*-'''__author__ = '[email protected]' 29: Divide Two Integershttps://oj.leetcode.com/problems/divide-two-integers/ Divide two integers without using multiplication, division and mod operator.If it is overflow, return MAX_INT. ===C

[LeetCode] 数学计算模拟类问题:除法和幂,注意越界问题。题 Pow(x, n) ,Divide Two Integers

引言 数学计算的模拟类题目,往往是要求实现某种计算(比如两数相除),实现的过程中会有所限定,比如不允许乘法等等. 这类题目首先要注意计算过程中本身的特殊情况.比如求相除,则必须首先反映过来除数不能为0. 其次要记得考虑负数的情况,如果计算范围不单单是整数,还要考虑double的比较方式. 最后要注意越界情况,这个是最容易犯错的,只能具体问题具体分析. 例题 1 Pow(x, n) Implement pow(x, n). class Solution { public: double pow(d