两种方法:
- 辗转相减法(普通版,耗时684ms)
- 辗转相减法(升级版,耗时2ms,引入乘法,提高了相减的效率)
基本步骤如下:
- 保存符号
- 对两数取绝对值
- 辗转相减,记录次数
- 加上符号,得出结果
基本思想还是用位运算进行/模拟以下运算:求符号;求相反数;求加法/减法(本题可直接使用加法减法,但是升级版代码里我也实现了加法减法)。
辗转相减法(普通版)
// // 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); } };