码迷,mamicode.com
首页 > 其他好文 > 详细

29. Divide Two Integers

时间:2016-05-07 13:32:18      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

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

If it is overflow, return MAX_INT.

对两个整数做除法,不能使用乘法、除法和求余运算符。

如果结果发生溢出,返回MAX_INT。

这道题的描述十分简单,就是做除法,但是限制了运算符的使用。令D1为被除数,D2为除数,求D1/D2,分析一下除法的意义,就是求D1中包含了多少个D2,所以只要不断做减法,每次从D1中拿掉一个D2,直到D1小于零为止。然而这并不是一个高效的算法,每次拿掉一个D2显得有点笨,可以考虑一次拿掉多个D2,因为不能用乘法,只可用位移运算符来计算D2的倍数,每次将D2翻倍得到D3,直到D3大于D1为止,然后从D1拿掉D3/2。如此可降低了时间复杂度。

还需要注意的是整数的符号和越界的问题,代码如下:

int divide(int dividend, int divisor) {
    int64_t d1 = dividend;
    int64_t d2 = divisor;
    bool bNeg = (d1>0 && d2<0) || (d1<0 && d2>0);
    d1 = (d1<0)?-d1:d1;
    d2 = (d2<0)?-d2:d2;
    int64_t ret = 0;
    while (d1 >= d2)
    {
        int k = 1;
        while (d1 >= d2<<k)
            ++k;
        --k;
        ret += 1LL << k;
        d1 -= d2 << k;
    }
    
    if (bNeg) ret = -ret;
    if (ret > MAX_INT || ret < (int)MIN_INT)
        return MAX_INT;
    return ret;
}

 

29. Divide Two Integers

标签:

原文地址:http://www.cnblogs.com/zhiguoxu/p/5467955.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!