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

来源:互联网 发布:淘宝淘金币领取 编辑:程序博客网 时间:2024/06/05 02:39

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<<digit);//2的digit次方                n-=m;//被除数减去m            }            m=m>>1;//m缩小2倍            digit--;//digit减一,2的整数次方数        }        if(flag<0)//控制符号位            ret=-ret;        return ret;            }};


阅读全文
0 0
原创粉丝点击