Leetcode典型题解答和分析、归纳和汇总——T29(两数相除)

题目描述:

给定两个整数,被除数dividend和除数divisor,将两数相除,要求不使用除法、乘法和mod求余运算符。返回被除数除以除数得到的商。

题目解析:

本题的关键在于如何控制好商和余数的溢出。(采用移位的思想来表示乘法和除法:向左移1位,表示乘以2,向右移动一位,表示除以2)

class Solution{
    public:
    int divide(int dividend,int divisor){  //dividend为被除数,divisor为除数
    //排除除数为0的情况
    if(divisor==0) return INT_MAX;
    //排除除数为1的情况
    if(divisor==1) return dividend;
    //排除除数和被除数相等的情况
    if(dividend==divisor)  return 1;
    //排除除数=-1情况
    if(divisor == -1)
    {
        if(dividend>=0)
         return -dividend;
         else if(dividend>INT_MIN)
         return dividend;
         else return INT_MAX;
    }

    //如果除数为最小值,则此时
    if(divisor==INT_MIN)  return 0;

    int addCout =0;
    bool flag = false;

    if((dividend>0&&divisor>0)||(dividend<0&&divisor<0)) flag =true;//同号为真

    if(dividend == INT_MIN)  //当被除数为最小值
    {
        dividend+=abs(divisor);
        addCout=1;
    }

    int dend = abs(dividend);  //取被除数的绝对值
    int sor = abs(divisor); //取余数的绝对值

    int Cout = 0;
    if(dend<sor){ Cout =0;}
    else {
        while(dend>=sor)
        {
            long tmp =sor;
            int bCout = 1;
            while((2*tmp)<dend)  //相当于移位操作
            {
                tmp=2*tmp;
                bCout=2*bCout;
            }
            dend = dend-tmp;
            Cout = Cout+bCout;
        }
    }

    if(flag==true) return Cout+addCout;
    else return -(Cout+addCout);

    }
};

发布了56 篇原创文章 · 获赞 7 · 访问量 4483

猜你喜欢

转载自blog.csdn.net/weixin_44504987/article/details/104339458