[LeetCode] #29 两数相除
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333..) = truncate(3) = 3
以 10/3 为例,对3不断翻倍,3 -> 6 -> 12 此时12超出10,即可用10-6,剩余4留给下一轮。6包含了2个3,计数器+2,本轮结束;
重复以上操作,4/3,同理3 -> 6 ,此时6超出4,即可用4-3,剩余1留给下一轮。只有一个3,计数器+1,本轮结束;
再次重复以上操作,1已经小于3,计算即可结束。
计数器2+1=3,即可得知10/3=3
(先转负数是为了避免负数转正数时的溢出问题)
class Solution { public int divide(int dividend, int divisor) { if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE; int res = 0; boolean isNeg = (dividend < 0 ^ divisor < 0); dividend = -Math.abs(dividend); divisor = -Math.abs(divisor); while(dividend <= divisor){ int tmp = 1; int div = divisor; while(div >= dividend - div){ div = div<<1; tmp = tmp<<1; } res += tmp; dividend -= div; } return isNeg ? -res : res; } }
知识点:无
总结:无