Cho tử số và mẫu số, trả về phân số dưới dạng chuỗi. Nếu phần thập phân lặp, đặt phần lặp trong ngoặc đơn. Ví dụ: 2/3 → "0.(6)".
Giải thuật
- Nếu tử số = 0 trả về "0".
- Mảng ký tự
ans. - Nếu dấu khác nhau thêm '-' vào
ans. divisor = |tử|,dividend = |mẫu|,remainder = divisor % dividend.- Thêm phần nguyên
divisor/dividendvàoans. - Nếu
remainder == 0trả về chuỗians. - Thêm '.' vào
ans. - Map
mlưu vị trí xuất hiện của dư. - Khi
remainder != 0:- Nếu
remainderđã có trongm: chèn '(' tạim[remainder], thêm ')' ở cuối, thoát. - Ngược lại:
m[remainder] = ans.size(),remainder *= 10, thêm(remainder/dividend)+'0'vàoans,remainder %= dividend.
- Nếu
- Trả về chuỗi
ans.
Ví dụ mã C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if (numerator == 0) return "0";
vector<char> ans;
if ((numerator < 0) ^ (denominator < 0)) ans.push_back('-');
long divisor = labs(numerator);
long dividend = labs(denominator);
long remainder = divisor % dividend;
string x = to_string(divisor / dividend);
for (char c : x) ans.push_back(c);
if (remainder == 0) return string(ans.begin(), ans.end());
ans.push_back('.');
unordered_map<long, int> m;
while (remainder != 0) {
if (m.count(remainder)) {
ans.insert(ans.begin() + m[remainder], '(');
ans.push_back(')');
break;
}
m[remainder] = ans.size();
remainder *= 10;
ans.push_back('0' + remainder / dividend);
remainder %= dividend;
}
return string(ans.begin(), ans.end());
}
};
Đầu vào
100 6
Đầu ra
16.(6)