Divide Two Integers
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
tags: math, binary search
8/10/2015 update
Reference http://yucoding.blogspot.com/2013/01/leetcode-question-28-divide-two-integers.html
class Solution { public: int divide(int dividend, int divisor) { int flag = 1; long ldividend = dividend; long ldivisor = divisor; if(ldividend < 0){ ldividend = -ldividend; flag *= -1; } if(ldivisor < 0){ ldivisor *= -1; flag *= -1; } long quotient = 0; while(ldividend >= ldivisor){ long thisQuotient = 1; long d = ldivisor; while(d <= ldividend){ d = d << 1; thisQuotient = thisQuotient << 1; } d = d >> 1; thisQuotient = thisQuotient >> 1; ldividend -= d; quotient += thisQuotient; } quotient *= flag; if(quotient == (long)0x80000000){ return 0x7fffffff; } else{ return quotient; } } };
tag中的binarysearch应该值在移位dividend时,通过比较reminder和divisor的大小决定给quotient赋值1还是0.
实际上,通过二分查找整个32位int的空间,仅需32次二分查找操作。
需要注意的是:按位与(&)的优先级小于逻辑等于(==),所以要在&加上括号以保证正确的运算顺序。
class Solution { public: int divide(int dividend, int divisor) { int flag = 1; int overflow = 0; if(divisor == 0){ return INT_MAX; } if(dividend == 0x80000000){// minimal 32-bit integer if(divisor == -1){ return INT_MAX;//overflow } else{ dividend = 0x7FFFFFFF; overflow = 1; flag *= -1; } } else if(dividend < 0){ dividend *= -1; flag *= -1; } if(divisor == 0x80000000){// minimal 32-bit integer if(dividend == 0x7FFFFFFF && overflow == 1){ return 1; // 0x80000000 / 0x80000000 } else{ return 0;//any other 32-bit integers divided by 0x80000000 would be 0 } } else if(divisor < 0){ divisor *= -1; flag *= -1; } //article begin int bit = 0x40000000; int reminder = 0; int quotient = 0; while(bit > 0){ reminder = reminder << 1; if((bit & dividend) > 0){//parenthese is IMPORTANT! reminder += 1; } bit = bit >> 1; if(reminder >= divisor){ reminder -= divisor; quotient = quotient << 1; quotient += 1; } else{ quotient = quotient << 1; } } //deal with overflow and flag reminder += overflow; if(reminder >= divisor){ quotient += 1;//no need to shift } quotient *= flag; return quotient; } };