Cho hai số nguyên dividend (số bị chia) và divisor (số chia). Yêu cầu chia hai số nguyên không sử dụng phép nhân, chia, lấy dư. Trả về thương số sau khi chia, phần thập phân bị cắt bỏ (truncate toward zero). Cả hai đầu vào đều là số nguyên.
Ví dụ: dividend = 7, divisor = -3 → kết quả = -2.
Giải pháp:
- Nhận hai tham số x, y (x chia y).
- Nếu x < -∞ và y = 1 → trả về ∞.
- a := |x|, b := |y|, ans := 0.
- While a - b ≥ 0:
- p := 0.
- While a - (b dịch trái 1 lần, p lần) ≥ 0: p := p + 1.
- a := a - (b dịch trái p lần).
- ans := ans + (1 dịch trái p lần).
- Nếu x > 0 và y > 0 → trả về ans, ngược lại trả về -ans.
Ví dụ C++
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
int divide(int l, int y) {
if (l <= INT_MIN && y == -1) return INT_MAX;
lli a = labs(l);
lli b = labs(y);
lli ans = 0;
while (a - b >= 0) {
int x = 0;
while (a - (b << 1 << x) >= 0) {
x++;
}
a -= b << x;
ans += 1 << x;
}
return (l > 0) == (y > 0) ? ans : -ans;
}
};
int main() {
Solution ob;
cout << ob.divide(40, 3);
}
Đầu vào
40 3
Đầu ra
13