[leetcode]29. Divide Two Integers不用除法实现除法

思路是不断将被除数分为两部分,每次分的一部分都是尽量大的除数的倍数,然后最后的商就是倍数加上剩下的部分再分,知道不够大。

递归实现

剩下的难点就是,正负号(判断商正负后将两个数都取绝对值),数太大(将数转成long类型),特殊情况(0除数和商太大)

public int divide(int dividend, int divisor) {
        //判断结果的正负
        int flag = (dividend<0 != divisor<0)?-1:1;
        long lend = Math.abs((long)dividend);
        long lor = Math.abs((long)divisor);
        //特殊情况
        if (divisor==0) return Integer.MAX_VALUE;
        long res =ld(lend,lor);
        if (res>Integer.MAX_VALUE)
            return (flag>0)?Integer.MAX_VALUE:Integer.MIN_VALUE;
        else return (int)res*flag;
    }
    public long ld(long lend,long lor)
    {
        if (lend<lor) return 0;
        long sum = lor;
        long m = 1;
        //尝试将被除数分成两部分,其中一部分是小于被除数的m倍除数,需要不断尝试
        while (sum*2<lend)
        {
            sum+=sum;
            m+=m;
        }
        //将剩下的部分再分
        return m+ld(lend-sum,lor);
    }

 

posted @ 2018-02-24 16:39  stAr_1  阅读(186)  评论(0编辑  收藏  举报