整数除法
问题简述
给定两个整数 a 和 b ,求它们的除法的商 a/b。
要求不得使用乘号 '*'、除号 '/' 以及求余符号 '%'。
思路1:减法(超时)
用 a 循环减 b,直到为负;
越界讨论:因为是整数除法,实际的越界情况就一种,就是
a=-2^31,b=-1
极端情况:
a=2^31-1, b=1
要循坏2^31-1
次;
思路2:二分思想
初始化返回值
ret = 0
a > b
时,不断将b
翻倍(乘 2),直到再翻倍一次就大于a
,记翻倍后的数为tmp_b
,翻的倍数为tmp
,然后将ret
加上tmp
、a
减去tmp_b
;a
减去tmp_b
后循环以上过程,直到a
小于b
;
以 a = 32, b = 3 为例,模拟过程如下:
初始化 ret = 0
第一轮:
32 / (3*2*2*2) = t1 / (1*2*2*2) # 再乘一个 2 会大于 32
32 / 24 = 1 = t1 / 8 -> t1 = 8
(32 - 24) / 3 = 8 / 3
ret += t1 -> 8
第二轮:
8 / (3*2) = t2 / (1*2)
8 / 6 = 1 = t2 / 2 -> t2 = 2
(8 - 6) / 3 = 0
ret += t2 -> 10
因为 2 < 3 退出循环
Last updated