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.

这道题的要求是在不使用乘法、除法、取模运算的前提下实现两个整数相除。如果溢出,返回MAX_INT。

这道题的直接思路是用被除数不断减去除数,直到为0。这种方法的迭代次数是结果的大小,即比如结果为n,算法复杂度是O(n)。

可以采用位运算进行优化,即模拟计算机上的除法运算。将整数转化成二进制形式,即num = a0*2^0 + a1*2^1 + a2*2^2 + ... + an*2^n。基于以上这个公式以及左移一位相当于乘以2,可以先让除数左移直到大于被除数之前得到一个最大的基数。然后每次用被除数去减去这个基数,同时结果增加2^k。接下来继续重新左移除数左移迭代,直到被除数不大于除数为止。因为这个方法的迭代次数是按2的幂直到结束,所以时间复杂度为O(logn)。

值得注意的地方,主要就是处理符号和溢出问题。对于溢出问题,可以先采用long long进行计算,也可以在移位前判断移位后是否溢出。

时间复杂度:O(logn)

空间复杂度:O(1)

 1 class Solution
 2 {
 3 public:
 4     int divide(int dividend, int divisor)
 5     {
 6         int sign = (dividend < 0) ^ (divisor < 0) ? - 1 : 1;
 7         long long res = 0, m = abs((long long)dividend), n = abs((long long)divisor);
 8         while(m >= n)
 9         {
10             long long t = n, i = 1;
11             while(t << 1 < m)
12             {
13                 t <<= 1;
14                 i <<= 1;
15             }
16             m -= t;
17             res += i;
18         }
19         if(sign < 0)
20             res = -res;
21         return res > INT_MAX ? INT_MAX : res;
22     }
23 };

转载请说明出处:LeetCode --- 29. Divide Two Integers

时间: 2024-10-06 00:56:50

LeetCode --- 29. Divide Two Integers的相关文章

LeetCode 29 Divide Two Integers(两个整数相除)(*)

翻译 不用乘法.除法.取余操作,将两个数相除. 如果它溢出了,返回MAX_INT 原文 Divide two integers without using multiplication, division and mod operator. If it is overflow, return MAX_INT. 代码 一心扑到了递归上,可惜没能写出来----烦躁至极还是找了别人的答案-- class Solution { public: int divide(int dividend, int d

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

Java [leetcode 29]Divide Two Integers

题目描述: Divide two integers without using multiplication, division and mod operator. If it is overflow, return MAX_INT. 解题思路: 把除数表示为:dividend = 2^i * divisor + 2^(i-1) * divisor + ... + 2^0 * divisor.这样一来,我们所求的商就是各系数之和了,而每个系数都可以通过移位操作获得. 详细解说请参考:http:/

LeetCode 29 Divide Two Integers (C,C++,Java,Python)

Problem: Divide two integers without using multiplication, division and mod operator. If it is overflow, return MAX_INT. Solution: 不能乘除就加减就行了,但是一个问题是加减有可能速度太慢,因此需要转换,由于任何一个数都能表示成二进制,所以有dividend=divisor*(a*2^1 + b*2^2 + ...... + m*2^k) 所以只要计算出所有diviso

LeetCode 29 Divide Two Integers (不使用乘法,除法,求模计算两个数的除法)

题目链接: https://leetcode.com/problems/divide-two-integers/?tab=Description Problem :不使用乘法,除法,求模计算两个数的除法~ 除法运算:被除数中包含有多少个除数的计算 由于是int类型的除法,因此结果可能超过int的最大值,当超过int的最大值时输出int的最大值 另写除法函数,计算出除法的商. 首先判断出除法运算后的结果是正数还是负数. 之后需要将被除数和除数都变为正数,进行进一步计算 当被除数小于除数时,返回0

LeetCode: 29. Divide Two Integers (Medium)

1. 原题链接 https://leetcode.com/problems/divide-two-integers/description/ 2. 题目要求 给出被除数dividend和除数divisor,求出二者相除的商,余数忽略不计. 注意:不能使用乘法.除法和取余运算 3. 解题思路 陷阱一:MIN_VALUE/-1会溢出.因为Integer.MIN_VALUE = -的绝对值比Integer.MAX_VALUE大1 陷阱二:除数divisor不能等于"0" 思路一:使用一个wh

LeetCode开心刷题十六天——29. Divide Two Integers*

From now on,I grade the questions I've done,* less means more difficult *** done by myself **need see answer,but I can reappear it *need see answer&hard to reappear 29. Divide Two Integers Medium 7003349FavoriteShare Given two integers dividend and d

LeetCode 28 Divide Two Integers

Divide two integers without using multiplication, division and mod operator. 思路:1.先将被除数和除数转化为long的非负数,注意一定要为long,因为Integer.MIN_VALUE的绝对值超出了Integer的范围. 2.常理:任何正整数num都可以表示为num=2^a+2^b+2^c+...+2^n,故可以采用2^a+2^b+2^c+...+2^n来表示商,即dividend=divisor*(2^a+2^b+

No.29 Divide Two Integers

No.29 Divide Two Integers Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 反转数字:将对10整除和取余的结果逆置即可难点即细节:溢出.符号疑问:溢出的,怎么处理?——提交一次出错后,知道应该是返回0 为防溢出,提升类型为long long,注意判断INT_MAX.INT_MIN 1 #include "stdafx.h" 2 #