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

Phân số thành thập phân lặp trong C++


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/dividend vào ans.
  • Nếu remainder == 0 trả về chuỗi ans.
  • Thêm '.' vào ans.
  • Map m lưu vị trí xuất hiện của dư.
  • Khi remainder != 0:
    • Nếu remainder đã có trong m: chèn '(' tại m[remainder], thêm ')' ở cuối, thoát.
    • Ngược lại: m[remainder] = ans.size(), remainder *= 10, thêm (remainder/dividend)+'0' vào ans, remainder %= dividend.
  • 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)