29. 两数相除

mac2024-04-06  35

题目链接:https://leetcode-cn.com/problems/divide-two-integers

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

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

示例 1:

输入: dividend = 10, divisor = 3 输出: 3 示例 2:

输入: dividend = 7, divisor = -3 输出: -2 说明:

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

思想:

不能用除法就只能用位运算了,所以就是把被除数dividend给拆分。比如被除数= 23,除数 = 3,则被除数可以成拆分成23 = 3*2^2+3*2^1+3*2^0...。(23 = 12 + 6 + 3 +...),所以商等于4+2+1 = 7。

在vs下不能通过但是在LeetCode上可以过,如果把t定义是long的话。因为vs即使是64位电脑也是32位,long仍然是4B,表示的数据范围和int一样,所以改用long long 表示8B就可以了。

注意边界条件,如果是INT_MIN,除以1的时候,由于我们会利用abs取绝对值,所以-INT_MIN就溢出了,要特别分清楚这两种情况。

class Solution { public: int divide(int dividend, int divisor) { if (dividend == INT_MIN && divisor == -1) return INT_MAX; if (dividend == INT_MIN && divisor == 1) return INT_MIN; int flag = ((dividend<0) ^ (divisor<0)) ? -1 : 1; int res = 0; long m = labs(dividend); long n = labs(divisor); while (m >= n) { int count = 1; long long t = n; while (m >= (t << 1)) { t = t << 1; count = count << 1; } res += count; m -= t; } return flag * res; } };
最新回复(0)