思路是不断将被除数分为两部分,每次分的一部分都是尽量大的除数的倍数,然后最后的商就是倍数加上剩下的部分再分,知道不够大。
递归实现
剩下的难点就是,正负号(判断商正负后将两个数都取绝对值),数太大(将数转成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); }