Computer >> Máy Tính >  >> Lập trình >> C ++

Chương trình hiển thị số thập phân từ biểu diễn số hữu tỉ trong C ++

Giả sử chúng ta có hai số được gọi là tử số và mẫu số biểu diễn một số hữu tỉ ở dạng (tử số / mẫu số). Chúng ta phải tìm biểu diễn thập phân của nó dưới dạng một chuỗi. Nếu có một số số lặp lại, thì đặt chúng bằng dấu ngoặc vuông.

Vì vậy, nếu đầu vào giống như tử số =164 mẫu số =3, thì đầu ra sẽ là "54. (6)".

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • nếu tử số giống 0, thì -
    • trả về "0"
  • Xác định ans mảng
  • nếu tử số <0 và mẫu số> 0 hoặc tử số> 0 và mẫu số <0, thì -
    • chèn '-' vào cuối ans
  • số chia:=| tử số |
  • cổ tức:=| mẫu số |
  • remainder:=divisor mod cổ tức
  • x:=convert (số chia / số bị chia) thành chuỗi
  • để khởi tạo i:=0, khi i
  • chèn x [i] vào cuối ans
  • nếu phần còn lại bằng 0, thì -
    • trả về ans dưới dạng chuỗi
  • chèn '.' vào cuối ans
  • Xác định một bản đồ m
  • trong khi phần dư không bằng 0, thực hiện -
    • nếu phần còn lại không tính bằng m, thì -
      • insert (phần tử đầu tiên của ans nối '(') vào ans
      • chèn ')' vào cuối ans
      • Ra khỏi vòng lặp
    • Nếu không -
      • m [phần còn lại]:=kích thước của ans
      • remainder:=remainder * 10
      • chèn (phần còn lại / cổ tức) nối '0' vào cuối ans
      • remainder:=còn lại mod cổ tức
  • trả về ans dưới dạng chuỗi
  • Ví dụ

    Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

    #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 || 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 (int i = 0; i < x.size(); i++) {
                ans.push_back(x[i]);
             }
             if (remainder == 0) {
             return string(ans.begin(), ans.end());
          }
          ans.push_back('.');
          map<int, int> m;
          while (remainder != 0) {
             if (m.find(remainder) != m.end()) {
                ans.insert(ans.begin() + m[remainder], '(');
                ans.push_back(')');
                break;
             } else {
                m[remainder] = ans.size();
                remainder *= 10;
                ans.push_back((remainder / dividend) + '0');
                remainder %= dividend;
             }
          }
          return string(ans.begin(), ans.end());
       }
    };
    string solve(int numerator, int denominator) {
       return (new Solution())->solve(numerator, denominator);
    }
    int main() {
       cout << solve(164, 3);
    }

    Đầu vào

    164, 3

    Đầu ra

    54.(6)