Divide Two Integers

来源:互联网 发布:csol刀战优化 编辑:程序博客网 时间:2024/06/03 22:40

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

获得两个整数的商,不使用乘法、除法、取模操作。

如果结果越界,返回最大值。


首先是这已明确能使用的运算操作基本加和减了

然后是一个整数除以另一个整数结果绝对值相同,比如17和3 、 -17和3、 -17和-3、17和-3,以上4种情况答案的绝对值都为5。

明确上述情况以后我们只要将除数和被除数化成同一符号就好了,这里我选择化成负数,因为int类型的范围为 -2147483648 ~ +2147483647

如果统一化成正数,则当取-2147483648时,正数2147483648会越界,因此化成负数则不会出现这样的情况

唯一越界情况为,被除数取最小值-2147483648而除数取-1时,结果2147483648会越界,此时应该返回最大值2147483647

因此在开始时便加入判断语句判断被除数和除数是否是以上的特殊情况

被除数为0时,可以快速判断结果为0

然后就是正题,当被除数与除数都化成负数以后该怎么操作:

用符号A表示被除数,B表示被除数,C表示商(初始值为0),直观的办法就是 当A-B<0(因为我们将A和B都取为负数,若为正数则是A-B>0),则C=C+1;A=A-B

最后的结果C,若除数和被除数异号,则C为负值,否则C不需要变号

但是以上的方法在被除数绝对值很大比如A=2147483648,除数绝对值很小比如B=1时,会消耗大量时间,因此

我们需要一个空间将除数存进来,比如除数B=-3时,我们将-3,-6,-12,-24,-48,.....,-3*2^n存起来,

满足-3*2^n > A 且 -3*2^(n+1) < A

从N->1,若A-B[i] < 0,则C=C+2^(n+1)。

方法是一样的,但这样让原本时间复杂度从O(C)变成了O(log C)。

至此,代码如下:

   int divide(int dividend, int divisor) {        if(dividend == 0){            return 0;        }        //////////////////////特殊情况被除数0        if(dividend == -2147483648 && divisor == -1){            return 2147483647;        }        ////////////////////////越界情况        bool zhengfu = 0;////////////////////////结果是否变号        if(dividend > 0 && divisor > 0){            dividend = -dividend;            divisor =  -divisor;        }        else if(dividend > 0 && divisor < 0){            dividend = -dividend;            zhengfu = 1;        }        else if(dividend < 0 && divisor > 0){            divisor = -divisor;            zhengfu = 1;        }        //////////////////////////////////化被除数与除数为负数        int jieguo = 0;        vector<int> a;////////////////////存储倍化的除数        vector<int> b;////////////////////存储。。。        int c = 1;        b.push_back(c);        a.push_back(divisor);        while(dividend - divisor <= divisor){            divisor += divisor;            c+=c;            a.push_back(divisor);            b.push_back(c);        }        ///////////存储a和b的过程        for(int i = a.size() - 1; i >= 0; --i){            if(dividend <= a[i]){                dividend -= a[i];                jieguo += b[i];            }        }        //////////获取商的过程        if(zhengfu){            jieguo = -jieguo;        }        return jieguo;    }


原创粉丝点击