Divide Two Integers[leetcode]递归与循环

来源:互联网 发布:数据字典是用来定义 编辑:程序博客网 时间:2024/05/20 06:55

递归方法:

int divide(int dividend, int divisor) {        bool isNeg = false;        long long dvs = divisor,dvd = dividend;        if (dividend < 0)        {            isNeg = !isNeg;            dvd = -dvd;        }        if (divisor < 0)        {            isNeg = !isNeg;            dvs = -dvs;        }        if(isNeg)             return -divideCore(dvd, dvs, dvs, 1);        else            return divideCore(dvd, dvs, dvs, 1);    }        int divideCore(long long dvd, long long dvs, long long cur, long long mul)    {        if (dvd - dvs < 0)             return 0;        if (cur + cur < dvd)            return divideCore (dvd, dvs, cur + cur, mul + mul);        else             return mul + divideCore (dvd - cur, dvs, dvs, 1);    }

循环方法,利用divisor * x <= dividend, 从最高位31位开始猜x的值

int divide(int dividend, int divisor) {        bool isNeg = false;        long long dvs = divisor,dvd = dividend;        if (dividend < 0)        {            isNeg = !isNeg;            dvd = -dvd;        }        if (divisor < 0)        {            isNeg = !isNeg;            dvs = -dvs;        }        if (dvd < dvs) return 0;        if(isNeg)             return -divideCore(dvd, dvs);        else            return divideCore(dvd, dvs);    }        int divideCore(long long dvd, long long dvs)    {        long long res = 0;        int k = 31;        long long curDivid = dvd;        while (k>=0)        {            if (dvs <= curDivid >> k)            {                curDivid -= dvs << k;                res += 1 << k;            }            k--;        }        return res;    }

对于符号的检测,有更加优雅的方法:

   int divide(int dividend, int divisor) {int count = 0;if (divisor == 0)return 0;unsigned int d1 = (dividend < 0 ? -dividend : dividend);unsigned int d2 = (divisor < 0 ? -divisor : divisor);for (int i = 31; i >= 0; i--){if ((d1 >> i) >= d2)//(dividend >= (divisor << i)) 溢出{d1 -= (d2 << i);count += (1 << i);}}if ((dividend >> 31) ^ (divisor >> 31))count = -count;return count;}
0 0