题目ide
Divide two integers without using multiplication, division and mod operator.
code
If it is overflow, return MAX_INT.
ip
解体思路it
首先明确要求:在此题当中,咱们不能使用乘法、除法和取模操做。因此,咱们只可以使用加法、减法和位操做。
io
先看一个例子。class
假设咱们要进行15除以3这个操做,那么15就是被除数,3是除数。除法简单地来讲就是计算除数可以从被除数当中减去多少次(知道被除数不能再减,否则就成了负数)。
di
首先15 - 3 = 12,12 > 0。而后咱们能够尝试减去更多,将3向左移一位,咱们获得3 << 1 = 6。15 - 6 = 9,9仍然大于0。咱们再次移位,3 << 2 = 12,15 - 12 = 3。而后再次移位,3 << 3 = 24,15 - 24 < 0。这时候咱们知道最多只能将3向左移位两次,否则被除数就会为负。vi
咱们知道12是由3向左移位两次获得,12是3的4倍。4 = 1 << 2。12 = (1 << 2)*3。因而能够将4加入到结果当中(初始结果为0)。以上过程相似与15 = 3 * 4 + 3,咱们获得了系数4和余数3。while
而后咱们继续以上的过程。对余数3进行上面的操做,咱们获得了0。最后结果为result = (1 << 2) + (1 << 0)。co
注意,有两种状况会引发溢出:
1. divisor = 0
2. dividend = INT_MAX 而且 divisor = -1,由于abs(INT_MIN) = INT_MAX + 1
代码以下:
class Solution { public: int divide(int dividend, int divisor) { int result = 0; if (divisor == 0) { return INT_MAX; } if (dividend == INT_MIN && divisor == -1) { return INT_MAX; } if (dividend == 0) { return 0; } int sign; if ((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) { sign = 0; } else{ sign = 1; } long long did = labs(dividend); //注意这里应该是labs,不要使用abs long long dis = labs(divisor); long long temp = dis; int count = 0; while (temp <= did) { temp = temp << 1; count++; } count--; while (did > 0) { if (did < dis) //被除数已经除尽,余数为0或者小于除数 { break; } if (did - (dis << count) < 0 && count > 0) { count--; continue; } did = did - (dis << count); result = result + (1 << count); count--; } if (sign) { return -result; } else{ return result; } } };