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

来源:互联网 发布:cf专业刷枪软件 编辑:程序博客网 时间:2024/05/29 18:12

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;}
0 0
原创粉丝点击