29、两数相除

tech2022-11-26  92

先说一个通不过答案的解法:使用递归法,如果被除数大于除数,用被除数减去除数,此时结果至少为1。然后将被除数减去除数得到的数再和除数进行递归,这就是整个递归的思路。但是这样效率很低,当被除数和除数相差太大的时候,容易爆栈,所以说是一个不合适的答案。

//StackOverFlow public int div( int dividend, int divisor ){ if ( dividend < divisor ){ return 0; }else{ return div(dividend-divisor, divisor) + 1; } }

 优化以后的解法:当被除数大于除数的时候,表明相除结果至少为1,然后让除数翻倍,如果被除数还大于除数表示相除结果至少为2(也翻倍),一直循环下去得到的除数已经足够大,同时也得到了合适的倍数。然后让被除数减去这个翻了不知道多少倍的除数得到新的被除数,除数为最开始的除数进行递归操作。这种方法可以加速求解两数相除得到的结果。

public int div(long dividend, long divisor){ if(dividend < divisor) return 0; long count = 1; long tb = divisor; while((tb+tb)<=dividend){ count = count + count; tb = tb+tb; } return count + div(dividend-tb,divisor); }

完整代码:

class Solution { public int divide(int dividend, int divisor) { long a = dividend; long b = divisor; if ( dividend == Integer.MIN_VALUE && divisor == -1 ) return Integer.MAX_VALUE; if ( divisor == 1 ) return dividend; int sign = 1; if ( (dividend<0 && divisor>0) || (divisor<0 && dividend>0) ){ sign = -1; } a = a>0?a:-a; b = b>0?b:-b; long result = div(a, b); if ( sign == -1 ) result *= -1; return (int)result; } public long div( long a, long b ){ if ( a< b) return 0; long count = 1; long tb = b; while ( (a>=tb+tb) ){ count = count+ count; tb = tb+tb; } return count + div(a-tb, b); } }

 

最新回复(0)