ให้ numerator, denominator แปลงเป็นทศนิยม ถ้ามีส่วนซ้ำ ให้ล้อมด้วยวงเล็บ
ตัวอย่าง: 164/3 = "54.(6)"
ขั้นตอนการแก้ปัญหา
- จัดการเครื่องหมาย และส่วนจำนวนเต็ม
- คำนวณเศษ remainder = numerator % denominator
- ถ้า remainder==0 คืนค่าส่วนจำนวนเต็ม
- ใช้ Map เก็บ remainder → ตำแหน่งในผลลัพธ์
- วนซ้ำ: remainder *= 10, ดigita = remainder/denominator, remainder %= denominator
- ถ้าเจอ remainder ซ้ำ: insert '(' ที่ตำแหน่งเก่า, append ')' จบ
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string solve(int numerator, int denominator) {
if (numerator == 0) return "0";
vector<char> ans;
if ((numerator < 0) ^ (denominator < 0)) ans.push_back('-');
long div = labs(numerator), dvd = labs(denominator);
long rem = div % dvd;
string intPart = to_string(div / dvd);
for (char c : intPart) ans.push_back(c);
if (rem == 0) return string(ans.begin(), ans.end());
ans.push_back('.');
unordered_map<long,int> pos;
while (rem != 0) {
if (pos.count(rem)) {
ans.insert(ans.begin() + pos[rem], '(');
ans.push_back(')');
break;
}
pos[rem] = ans.size();
rem *= 10;
ans.push_back('0' + rem / dvd);
rem %= dvd;
}
return string(ans.begin(), ans.end());
}
};
int main() {
cout << (new Solution())->solve(164, 3); // 54.(6)
return 0;
}
อินพุต
164, 3
เอาต์พุต
54.(6)