[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;
    }
}

知识点:

总结:

 

posted @ 2021-10-11 14:48  1243741754  阅读(26)  评论(0编辑  收藏  举报