Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Chương trình chuyển số hữu tệ sang dạng thập phân có dấu ngoặc chu kỳ trong C++

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

  1. Xử lý dấu âm.
  2. Phần nguyên = |numerator| / |denominator|, dư = |numerator| % |denominator|.
  3. Nếu dư = 0 → trả về phần nguyên.
  4. Thêm dấu chấm. Dùng map lưu vị trí xuất hiện của mỗi dư.
  5. 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)