[LeetCode-29] Divide Two Integers(两个整数相除,不用乘除取余算术符)

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

If it is overflow, return MAX_INT.

采用减法代替除法
代码如下:

/*方法一、用减法代替除法*/
/** dividend: 被除数 divisor: 除数 **/
int divide(int dividend, int divisor)
{

    /*1.异常处理*/
    if(divisor == 0) {
        return 0;
    }
    int MAXINT = 2147483647;
    int MININT = -2147483648;
    long long divid = (long long)dividend;//考虑对最大最小整数取模的情况
    long long divi = (long long)divisor;

    /*避免多次计算,直接返回被除数*/
    if(divi == 1) {
        return (int)divid;
    }

    if(divi == -1) {
        /*溢出处理-2147483648/-1 = 2147483647 而不是2147483648*/
        if (divid <= -MININT) {
            return MAXINT;
        }
        return (int)(-dividend);
    }

    bool ispositive = true;

    /*2.负数处理*/
    if(divid<0)
    {
        divid = -divid;
        if(divi < 0) {
            divi = -divi;
        }
        else {
            ispositive = false;
        }
    }
    else if(divi<0) {
        divi = -divi;
        ispositive = false;
    }
    bool ispositive = true;

    /*2.负数处理*/
    if(dividend<0)
    {
        dividend = -dividend;
        if(divisor<0) {
            divisor = -divisor;
        }
        else {
            ispositive = false;
        }
    }
    else if(divisor<0) {
        divisor = -divisor;
        ispositive = false;
    }

    /*3.用减法代替除法*/
    while(dividend >= divisor) {
        dividend -= divisor;
        res++;
    }

    if(!ispositive) {
        res = -res;
    }
    return res;
}

提交结果是超时。

方法二、采用减法和移位来代替除法(通过)
算法思想如下:分析:题目意思很容易理解,就是不用乘除法和模运算求来做除法,很容易想到的一个方法是一直做减法,然后计数,但是提交之后显示超时,在网上找到一种解法,利用位运算,意思是任何一个整数可以表示成以2的幂为底的一组基的线性组合,即num=a_0*2^0+a_1*2^1+a_2*2^2+…+a_n*2^n。基于以上这个公式以及左移一位相当于乘以2,我们先让除数左移直到大于被除数之前得到一个最大的基n的值,说明被除数中至少包含2^n个除数,然后减去这个基数,再依次找到n-1,…,1的值。将所有的基数相加即可得到结果。

/*方法二,用减法和移位代替除法*/

int divide(int dividend, int divisor)
{
    /*1.异常处理*/
    if(divisor == 0) {
        return 0;
    }
    int MAXINT = 2147483647;
    int MININT = -2147483648;
    long long divid = (long long)dividend;//考虑对最大最小整数取模的情况
    long long divi = (long long)divisor;
    /*避免多次计算,直接返回被除数*/
    if(divi == 1) {
        return (int)divid;
    }

    if(divi == -1) {
        /*溢出处理-2147483648/-1 = 2147483647 而不是2147483648*/
        if (divid <= -MININT) {
            return MAXINT;
        }
        return (int)(-dividend);
    }

    bool ispositive = true;

// printf("[%d] divid %lld!\n",__LINE__,divid);
// printf("[%d] divi %lld!\n",__LINE__,divi);

    /*2.负数处理*/
    if(divid<0)
    {
        divid = -divid;
        if(divi < 0) {
            divi = -divi;
        }
        else {
            ispositive = false;
        }
    }
    else if(divi<0) {
        divi = -divi;
        ispositive = false;
    }

    long long res = 0;
    long long cnt = 1;

    long long temp = 0;

#if 1
    while(divi <= divid) {
        cnt = 1; /*2^n 次方*/
        temp = divi; 

        /*3.找到大于被除数的基数*/
        while(temp <= divid) {
            temp <<= 1;
            cnt <<= 1;
        }
        res += (cnt>>1);
        /*4.减去基数前一个数*/
        divid -= (temp>>1);
    }
#endif

    if(!ispositive) {
        res = -res;
    }

    return res;
}

你可能感兴趣的:(LeetCode)