标签:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
对两个整数做除法,不能使用乘法、除法和求余运算符。
如果结果发生溢出,返回MAX_INT。
这道题的描述十分简单,就是做除法,但是限制了运算符的使用。令D1为被除数,D2为除数,求D1/D2,分析一下除法的意义,就是求D1中包含了多少个D2,所以只要不断做减法,每次从D1中拿掉一个D2,直到D1小于零为止。然而这并不是一个高效的算法,每次拿掉一个D2显得有点笨,可以考虑一次拿掉多个D2,因为不能用乘法,只可用位移运算符来计算D2的倍数,每次将D2翻倍得到D3,直到D3大于D1为止,然后从D1拿掉D3/2。如此可降低了时间复杂度。
还需要注意的是整数的符号和越界的问题,代码如下:
int divide(int dividend, int divisor) { int64_t d1 = dividend; int64_t d2 = divisor; bool bNeg = (d1>0 && d2<0) || (d1<0 && d2>0); d1 = (d1<0)?-d1:d1; d2 = (d2<0)?-d2:d2; int64_t ret = 0; while (d1 >= d2) { int k = 1; while (d1 >= d2<<k) ++k; --k; ret += 1LL << k; d1 -= d2 << k; } if (bNeg) ret = -ret; if (ret > MAX_INT || ret < (int)MIN_INT) return MAX_INT; return ret; }
标签:
原文地址:http://www.cnblogs.com/zhiguoxu/p/5467955.html