题目:
给定两个整数 a
和 b
,求它们的除法的商 a/b
,要求不得使用乘号 '*'
、除号 '/'
以及求余符号 '%'
。
注意:
1.整数除法的结果应当截去(truncate)其小数部分
2.假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231−1]。本题中,如果除法结果溢出,则返回 231 − 1实例:
输入:a = 15, b = 2
输出:7
解释:15/2 = truncate(7.5) = 7
题目内容很简单,就是实现整数除法,但是不能使用乘除法,也就是说只能使用加减法计算
一开始想到的就是,首先记录最终的符号,将a和b先统一为整数,再通过相减,用变量ret记录当减多少个b时,a的值变为零.此时的b就是最终的结果
但是想法是对的,大部分人最先想到的解法应该和我一样,但是这道题错了
问题在与没有看提示,提示上说了a的最大值就是2^31-1 ,最小值是-2^31.所以此时要对这种情况分析,当a等于最小值,b等于-1,理论上算出来的结果就是2^32.但是已经越界了,此时的结果应该输出题目所给的2^31 - 1;
其次就是,如果当通过相减的方式,一次性减去一个b,这样的时间复杂度虽然是O(n),但是此时如果a的值足够大,b等于1,时间复杂度依然很大.为了减少时间复杂度,就必须通过其他方法,来降低时间复杂度