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

Phân số thành số thập phân tuần hoàn trong C ++

Giả sử chúng ta có hai số nguyên biểu thị tử số và mẫu số của một phân số, chúng ta phải tìm phân số ở dạng chuỗi. Nếu phần phân số đang lặp lại, hãy đặt phần lặp lại trong dấu ngoặc đơn. Vì vậy, nếu tử số là 2 và mẫu số là 3, thì kết quả đầu ra sẽ là “0. (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ố là 0, thì trả về 0

  • xác định ans một 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 ký hiệu âm ‘-’ vào mảng ans

  • số chia:=| tử số | và cổ tức:=| consminator |, còn lại:=divisor mod cổ tức

  • x:=chuỗi số bị chia / số cổ tức

  • chèn từng ký tự từ x vào mảng ans

  • nếu remainder =0, thì trả về mảng ans dưới dạng chuỗi.

  • chèn dấu chấm ‘.’ vào ans

  • xác định một bản đồ m

  • trong khi phần còn lại không phải là 0

    • nếu phần còn lại là m, thì

      • chèn các dấu ngoặc đơn đang mở ở chỉ mục m [phần còn lại] của ans

      • chèn dấu ngoặc đơn đóng vào dấu ans ở cuối

      • phá vỡ vòng lặp

    • nếu không thì

      • m [phần còn lại]:=kích thước của ans

      • phần còn lại:=phần còn lại * 10

      • chèn (phần còn lại / cổ tức) dưới dạng ký tự vào ans

      • remainder:=còn lại mod cổ tức

  • trả về mảng ans dưới dạng chuỗi.

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

Ví dụ

#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 || 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());
   }
};
main(){
   Solution ob;
   cout << ((ob.fractionToDecimal(100,6)));
}

Đầu vào

100
6

Đầu ra

16.(6)