Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมแปลงเศษส่วนเป็นทศนิยมมีวงเล็บซ้ำใน C++

ให้ numerator, denominator แปลงเป็นทศนิยม ถ้ามีส่วนซ้ำ ให้ล้อมด้วยวงเล็บ

ตัวอย่าง: 164/3 = "54.(6)"

ขั้นตอนการแก้ปัญหา

  1. จัดการเครื่องหมาย และส่วนจำนวนเต็ม
  2. คำนวณเศษ remainder = numerator % denominator
  3. ถ้า remainder==0 คืนค่าส่วนจำนวนเต็ม
  4. ใช้ Map เก็บ remainder → ตำแหน่งในผลลัพธ์
  5. วนซ้ำ: 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)