Solution:
The result can be seen as $a_n 2^n+ a_{n-1} 2^{n-1}+\dots+a_1 *2 +a_0$, with $a_i \in \{0,1\}$. Our solution calculates first n by obtaining the largest n that $\text{divisor} \cdot 2^n \leq \text{dividend}$. Then we just have to calculate $a_i = \left( \text{dividend} - \sum_{j=i+1}^n a_j \text{divisor} \cdot 2^j\right)>= 2^i$, even the expression is complex the code is much simpler:We had to change integers into longs to avoid the overflowing problem of -Integer.MIN_VALUE cannot be contained in an int.
public class Solution { public int divide(int dividend, int divisor) { long dividendL = dividend<0 ?-(long)dividend : (long)dividend; long divisorL = divisor<0 ? -(long)divisor : (long)divisor; if(dividendL<divisorL) return 0; long temp =divisorL; long result=0; long i=1; //We calculate n and 2^n while((temp<<1)<=dividendL) { temp<<=1; i<<=1; } //We calculate a_i and acumulate them in result while (dividendL>0 && i>0) { if(temp<=dividendL) { dividendL-=temp; result +=i; } temp>>=1; i>>=1; } return ((dividend & 0x80000000)^(divisor & 0x80000000)) ==0 ? (int)result : (int)(-result); } }
No comments :
Post a Comment