5.divide-two-integers(两个整数相除)

5.divide-two-integers(两个整数相除)

链接:http://www.lintcode.com/zh-cn/problem/divide-two-integers/

将两个整数相除,要求不使用乘法、除法和 mod运算符。

如果溢出,返回 2147483647 

分析:不能使用乘法、除法、和mod运算符,容易想到使用位运算。被除数可以表示为除数的2的整数幂的形式,显然时间复杂度是log(n)。为了方便,先把两个数都变成正整数,符号位直接由两个数的正负性即可得到。

注意:要考虑到溢出的情况,可分为以下几种,(1)除数为0,则返回INT_MAX,(2),被除数为最小数,若除数为-1,则直接返回INT_MAX,否则被除数加上除数的绝对值,这样被除数加绝对值时,才不会溢出,此时要给商加一,因为从整数的角度看,相当于被除数减掉一个除数(3)除数为INT_MIN,则直接返回商,要么为0,要么为1(此时,被除数也为INT_MIN)。

class Solution {
public:
    /**
     * @param dividend the dividend
     * @param divisor the divisor
     * @return the result
     */
    int divide(int dividend, int divisor) {
        // Write your code here
        if(divisor==0)
            return INT_MAX;
        int ret=0;
        if(dividend==INT_MIN)
        {
            dividend+=abs(divisor);
            if(divisor==-1)
            {
                return INT_MAX;
            }
            ret++;
        }
        if(divisor==INT_MIN)
            return ret;
        int flag=(dividend<0)^(divisor<0)?-1:1;		//符号位
        int n=abs(dividend);
        int m=abs(divisor);
        int digit=0;
        while(m<=(n>>1))	//digit找出2的整数幂的最大值,它与除数相乘即为m
        {
            m<<=1;
            digit++;
        }
        while(digit>=0)
        {
            if(n>=m)
            {
                ret+=(1<	//2的digit次方
                n-=m;			//被除数减去m
            }
            m=m>>1;			//m缩小2倍
            digit--;			//digit减一,2的整数次方数
        }
        if(flag<0)			//控制符号位
            ret=-ret;
        return ret;
        
    }
};


你可能感兴趣的:(5.divide-two-integers(两个整数相除))