1 题目描述
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
难度:Medium
2 题目样例
无。
3 题意分析
要求不用乘法,除法和取模运算,算出两个数字的商。
4 思路分析
我在思考了足足五秒钟,脑子里排除了各种”这…这也能算?”之后,想到了本学期在CSAPP中学到的内容。
既然不允许使用乘除和取模,那我们就从机器码最底层的运算入手,直接使用位运算对除法进行模拟就可以了。
出于取(偷)巧(懒)的考虑,我们可以把变量都设置成64位的,这样就保证了中间变量不溢出,最后的结果特殊判断即可。
注意其中一步,在取绝对值的时候,要使用强制类型转换。否则可能会造成数据溢出。
代码实现如下:
class Solution
{
public:
int divide(int dividend, int divisor)
{
int sign=1;
if(dividend*divisor<0)
sign=-1;
long long ans=0;
long long m=abs((long long)dividend);
long long n=abs((long long)divisor);
while(m>=n)
{
long long temp=n;
long long plus=1;
while((temp<<1)<m)
{
temp<<=1;
plus<<=1;
}
m-=temp;
ans+=plus;
}
if(sign<0)
ans=-ans;
if(ans>INT_MAX)
return INT_MAX;
else
return ans;
}
};
5 后记
学以致用?
CSAPP和算法导论里的内容似乎也是面试考察的重点内容呢……我已经不知道第多少次看到相关的题目了。