Manipulation Divide Two Integers

来源:互联网 发布:江西seo 编辑:程序博客网 时间:2024/05/21 14:04

思路:
模拟法。
只能使用加减法、位运算来实现除法。
这里使用了位运算。
Example:
42/4
step1:4(1个4)—>8(2个4)—>16(4个4)—>32(8个4)—>64(16个4)
step2:42-32 = 10
10/4
4(1个4)—>8(2个4)—>16(4个4)
step3:10-8=2 < 4
ans = 8 + 2 = 10;

class Solution {private:    //Divide Two Integers    long long divideL(unsigned long long dividend, unsigned long long divisor) {        unsigned long long tmp = divisor;        long long sum = 0;        unsigned long long lastTmp = 1;        while(dividend >= divisor) {            while(tmp <= dividend) {                tmp = tmp << 1;                lastTmp = (tmp > dividend) ? lastTmp : lastTmp << 1;            }            sum += lastTmp;            dividend = dividend - (tmp >> 1);            tmp = divisor;            lastTmp = 1;            if(tmp == dividend) return sum+1;        }        return sum;    }public:    int divide(int dividend, int divisor) {        unsigned long long dividendL = abs((long long)dividend);        unsigned long long divisorL = abs((long long)divisor);        int symbol = 1;        if ((dividend >= 0 && divisor < 0) || (dividend <= 0 && divisor > 0)) {            symbol = -1;        }        if(dividendL < divisorL) {            return 0;        }        if(dividendL == divisorL) {            return symbol;        }        if(divisorL == 1) {            long long ans = symbol*dividendL;            return ans > INT_MAX ? ans - 1 : ans;        }        int ans = divideL(dividendL, divisorL);        return symbol*ans;    }};
0 0
原创粉丝点击