两数相除(不用乘除取余)
给定两个整数,被除数 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 (题解)
【解题思路】
-
若不用乘、除、取余运算。那么我们可以将除法退化成加减法运算。
-
我们知道,用被除数(D)减去除数(d),再将所得的值赋给D,往复循环直到D<d时它们相减的次数即所得到的商。
-
这种方法简单,也很容易实现。但是如果出现像如__dividend 远大于 divisor__这种情况时将会很费时间。因此我们可以每次适当扩大d的值,这里使用左移(<<)来代替乘法,将其扩大为之前的2倍。然而除数扩大了几倍就要再计数的时候加上几(例如d<<1,此时D-d相当于减了2倍原来的d,因此计数器相应要+2)。