029 Divide Two Integers[M]

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和算法导论里的内容似乎也是面试考察的重点内容呢……我已经不知道第多少次看到相关的题目了。

    原文作者:Lolita
    原文地址: https://zhuanlan.zhihu.com/p/33961073
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞