两种方法:

  1. 辗转相减法(普通版,耗时684ms
  2. 辗转相减法(升级版,耗时2ms,引入乘法,提高了相减的效率)

基本步骤如下:

  1. 保存符号
  2. 对两数取绝对值
  3. 辗转相减,记录次数
  4. 加上符号,得出结果

基本思想还是用位运算进行/模拟以下运算:求符号;求相反数;求加法/减法(本题可直接使用加法减法,但是升级版代码里我也实现了加法减法)。

辗转相减法(普通版)

//
// Created by jt on 2020/8/14.
//
using namespace std;

class Solution {
public:
    /**
     *
     * @param dividend int整型
     * @param divisor int整型
     * @return int整型
     */
    int divide(int dividend, int divisor) {
        // write code here
        int ans = 0, sign = 0;
        // 1. 保存符号
        if (isPositive(dividend) ^ isPositive(divisor)) sign = 1;
        // 2. 取绝对值
        int x = abs(dividend), y = abs(divisor);
        // 3. 辗转相减
        while (x - y >= 0) {
            x = x - y;
            ans += 1;
        }
        // 4. 加上符号
        if (sign) ans = -ans;
        return ans;
    }

    bool isPositive(int i) {
        return !(i >> 31);
    }

    int abs(int i) {
        if (!isPositive(i)) i = negative(i);
        return i;
    }

    int negative(int i) {
        return ~i + 1;
    }
};

辗转相减法(升级版)

//
// Created by jt on 2020/8/12.
//
using namespace std;

class Solution {
public:
    /**
     *
     * @param dividend int整型
     * @param divisor int整型
     * @return int整型
     */
    int divide(int dividend, int divisor) {
        // write code here
        // 1. 保存符号
        bool isPos = true;
        if (isPositive(dividend) ^ isPositive(divisor)) isPos = false;
        // 2. 取绝对值
        int x = abs(dividend), y = abs(divisor);
        // 3. 辗转相减
        int ans = 0, i = 31;
        while (i >= 0) {
            // 如果够减(即y*(2^i) <= x)
            if ((x >> i) >= y) {
                x = minus(x, y << i);
                ans = plus(ans, 1 << i);
            }
            i = minus(i, 1);
        }
        // 4. 加上符号
        if (!isPos) ans = negative(ans);
        return ans;
    }

    int plus(int i, int j) {
        return j == 0 ? i : plus(i ^ j, (i & j) << 1);
    }

    int minus(int i, int j) {
        return plus(i, negative(j));
    }

    bool isPositive(int i) {
        return !(i >> 31);
    }

    int abs(int i) {
        if (!isPositive(i)) i = negative(i);
        return i;
    }

    int negative(int i) {
        return plus(~i, 1);
    }
};