Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 반복 소수점으로 분수

<시간/>

분수의 분자와 분모를 나타내는 두 개의 정수가 있다고 가정하고 문자열 형식의 분수를 찾아야 합니다. 소수 부분이 반복되는 경우 반복되는 부분을 괄호로 묶습니다. 따라서 분자가 2이고 분모가 3이면 출력은 "0.(6)"이 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 분자가 0이면 0을 반환

  • 하나의 배열을 정의하고

  • 분자 <0 및 분모> 0 또는 분자 0 및 분모 <0인 경우 ans 배열에 음수 기호 '-'를 삽입합니다.

  • 제수 :=|분자| 및 피제수 :=|분모|, 나머지 :=제수 모드 피제수

  • x :=제수 / 피제수 문자열

  • x의 각 문자를 배열로 삽입

  • 나머지 =0이면 배열을 문자열로 반환합니다.

  • ans에 점 '.' 삽입

  • 하나의 맵 정의

  • 나머지가 0이 아닌 동안

    • 나머지가 m에 있으면

      • ans

        의 인덱스 m[나머지]에 여는 괄호 삽입
      • 끝에 있는 ans에 닫는 괄호 삽입

      • 루프를 끊다

    • 그렇지 않으면

      • m[나머지] :=ans의 크기

      • 나머지 :=나머지 * 10

      • (나머지/피제수)를 ans

        에 문자로 삽입
      • 나머지 :=나머지 모드 배당

  • 배열을 문자열로 반환합니다.

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

#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)));
}

입력

100
6

출력

16.(6)