Mô tả bài toán
Cho tử số và mẫu số, biểu diễn số thập phân. Phần lặp lại đặt trong dấu ngoặc đơn.
Ví dụ: 164/3 → "54.(6)".
Giải thuật
- Xử lý dấu âm.
- Phần nguyên = |numerator| / |denominator|, dư = |numerator| % |denominator|.
- Nếu dư = 0 → trả về phần nguyên.
- Thêm dấu chấm. Dùng map lưu vị trí xuất hiện của mỗi dư.
- Lặp: dư *= 10, chữ số = dư / denominator, dư %= denominator. Nếu dư đã gặp → chèn '(' tại vị trí cũ, thêm ')' và dừng.
Ví dụ minh họa (C++)
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string solve(int numerator, int denominator) {
if (numerator == 0) return "0";
string ans;
if ((numerator < 0) ^ (denominator < 0)) ans += '-';
long num = labs(numerator), den = labs(denominator);
ans += to_string(num / den);
long rem = num % den;
if (rem == 0) return ans;
ans += '.';
unordered_map<long, int> pos;
while (rem != 0) {
if (pos.count(rem)) {
ans.insert(pos[rem], "(");
ans += ")";
break;
}
pos[rem] = ans.size();
rem *= 10;
ans += char('0' + rem / den);
rem %= den;
}
return ans;
}
};
int main() {
cout << Solution().solve(164, 3);
return 0;
}
Đầu vào
164, 3
Đầu ra
54.(6)