29. Divide Two Integers

用加减法模拟除法。

除法本质就是 被除数 - 商个除数相加 = 0

如果你电脑足够好,可以无限减。。但是这个题肯定不是这么简单。

最快的方法还是 减去 商乘以除数。
但是这里不能使用乘法,那只好用BIT的运算来实现了。

自己没做出来,但是发现一刷做出来了,怎么看都不像是我这个智商能写出来的,所以不知道当时看的哪的答案,贴出的答案如有冒犯,请告之。

比如19/3,只要分子比分母大,就可以除。
19 比 3大, 比2个还3大,牛逼牛逼,比4个3大,你敢信?比8个3小。。
那么19先减去4个3肯定没错,此时分子是19-4*3=7;结果是4,已经4个3了。

然后再看7/3,7比1个3大,比2个3大,那么分子就是7-2*3 = 1,结果是2+刚才的4=6。
然后1/3,比3小了,让你装逼。此时停止,结果是第一次的2+刚才的4=6.

所以就是通过BIT位操作来看剩下的分子比几个分母大,正常乘法是1234567个这么测试,测1次就行了,但是用BIT是测很多次,每次1248个,最后相加。

然后各种edge case好贱。

public class Solution {
    public int divide(int dividend, int divisor) 
    {
        if(dividend == 0) return 0;
        
        long up = (long)dividend; 
        long down = (long)divisor;
        
        boolean pos = (up*down) >= 0;
        up = Math.abs(up);
        down = Math.abs(down);
        
        long res = 0;
        while(up >= down)
        {
            int numOfDowns = 1;
            
            while(up > (down<<1))
            {
                
              down <<= 1;
              numOfDowns <<= 1;
                
            }
            
            up -= down;
            res += (long)numOfDowns;
            down = Math.abs((long)divisor);
        }

        if(res == (long)Integer.MIN_VALUE*(-1) && pos) return Integer.MAX_VALUE;
        if(pos) return (int)res;
        else return (int)res*-1;
    }
}
原文地址:https://www.cnblogs.com/reboot329/p/5887392.html