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

C++에서 유리수 표현에서 십진수를 표시하는 프로그램

<시간/>

분자/분모 형식의 유리수를 나타내는 분자와 분모라는 두 개의 숫자가 있다고 가정합니다. 십진수 표현을 문자열로 찾아야 합니다. 반복되는 숫자가 있으면 대괄호로 묶습니다.

따라서 입력이 numerator =164 denominator =3과 같으면 출력은 "54.(6)"이 됩니다.

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

  • 분자가 0과 같으면 -
    • "0" 반환
  • 배열 정의
  • 분자 <0 및 분모> 0 또는 분자> 0 및 분모 <0이면 −
    • as 끝에 '-' 삽입
  • 제수 :=|분자|
  • 배당금 :=|분모|
  • 나머지 :=제수 모드 피제수
  • x :=(제수 / 피제수)를 문자열로 변환
  • 초기화 i의 경우:=0, i
  • and 끝에 x[i] 삽입
  • 나머지가 0과 같으면 -
    • 문자열로 반환
  • '.' 삽입
  • 끝에
  • 하나의 지도 정의
  • 나머지가 0이 아닌 동안 수행 -
    • 나머지가 m이 아니면 -
      • insert(s의 첫 번째 요소는 '(')를 ans에 연결합니다.
      • as 끝에 ')' 삽입
      • 루프에서 빠져나오기
    • 그렇지 않으면 -
      • m[remainder] :=ans의 크기
      • 나머지 :=나머지 * 10
      • insert(나머지 / 피제수) ans 끝에 '0' 연결
      • 나머지 :=나머지 모드 배당
  • 문자열로 반환
  • 예시

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

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

    입력

    164, 3

    출력

    54.(6)