一. Divide Two Integers
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
Difficulty:Medium
TIME:TIMEOUT
解法
实现整数的除法,不能用乘法除法以及取余。因此就剩下加减法,用加减法当然可以,不过很明显当被除数过大,除数过小的时候,就会超时。
因此只能采用其他的方法, 那就是移位。
对于正整数n来说:
- n << k相当于 n∗2k
- n >> k相当于 n/2k
对于被除数dividend,以及除数divisor,有 dividend=divisor∗t+r ,其中r为余数。t既然作为整数,那么就可以令 t=20+21+...+2k ,也就是说 dividend=divisor∗(20+21+...+2k)+r ,结合上面的移位操作符则 dividend=divisor<<0+divisor<<1+...+divisor<<k+r ,那么这道题就可以通过这样的方法求解。
int divide(int dividend, int divisor) {
if(dividend == INT32_MIN && divisor == -1)
return INT32_MAX;
bool sign = (dividend < 0) ^ (divisor < 0);
long ldividend = labs(dividend);
long ldivisor = labs(divisor);
int result = 0;
while(ldividend >= ldivisor) {
long k = ldivisor;
long l = 1;
while(ldividend >= (k << 1)) {
k = k << 1;
l = l << 1;
}
result += l;
ldividend -= k;
}
return sign ? -result : result;
}
代码的时间复杂度为 O((logn)2) ,其中 n <script type="math/tex" id="MathJax-Element-30">n</script>为数字的位数。