两种方法:
- 辗转相减法(普通版,耗时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);
}
};
京公网安备 11010502036488号