Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
Subscribe to see which companies asked this questionc
思路:
首先,最基本的方法是将被除数减去除数,直至被除数小于除数,相减的次数就是商的大小。但是这种方法超时。
在上述方案的基础上,做出适当改进。将除数不断进行左移操作,即乘以2,直至除数大于或者等于被除数。记录左移的次数,即除数放大的倍数,记为temp。然后将被除数与放大之后的除数做减法运算,其效果相当于减去了temp个原来的除数。将temp累加到计数器上。重复这个循环,直至被除数小于除数。最终计数器的值就是商。
注意一点,对于溢出题目给出了超出上限,直接返回上限值。这里需要注意abs(INT_MIN)=INT_MAX+1 .
class Solution { public: int divide(int dividend, int divisor) { if(dividend==0) return 0; long long m= abs((long long) dividend); long long n =abs((long long) divisor); long long ret=0; //是否商是负数 bool flag =(dividend >0) ^(divisor>0); while (m>=n){ long long temp=1; long long a= n; while ((a<<1)<m){ a=a<<1; temp=temp<<1; } ret+=temp; m-=a; } if(!flag){ if(ret>=INT_MAX) return INT_MAX; return ret; } if(ret >INT_MAX) return INT_MIN; return -ret; } };