Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
Subscribe to see which companies asked this question
题目要求:
不能使用乘除法和模操作 只能使用位运算和加减法
最开始想到的就是用被减去一直减去减数。。。 当然这样的时间复杂度不是最优的。
接着想到以2为基的数学形式表达,可以这样做: 减数一直左移 直到大于被减数。
这样是以2的幂次进行迭代,算法的时间复杂度为 O(logn)
上代码(已AC - 2016-03-24):
// 不能使用乘除法和模操作 只能使用位运算和加减法 int divide(int dividend, int divisor) { // 边界判断 if (divisor == 0 || (dividend == INT_MIN && divisor == -1)) return INT_MAX; bool isNeg = (dividend < 0) ^ (divisor < 0); long long dvd = labs(dividend); long long dvs = labs(divisor); long long res = 0; while (dvd >= dvs) { long long tmp = dvs, mul = 1; while (dvd >= (tmp << 1)) { tmp <<= 1; mul <<= 1; } dvd -= tmp; res += mul; } return (isNeg) ? -res : res; }