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

C++의 동일한 유리수

<시간/>

두 개의 문자열이 있다고 가정합니다. 이들은 각각 양의 유리수를 나타내는 S와 T입니다. 동일한 숫자를 나타내는지 아니면 지금 나타내는지 확인해야 합니다. 문자열은 유리수의 반복 부분을 나타내기 위해 괄호를 사용할 수 있습니다.

유리수는 정수 부분, 반복되지 않는 부분, 반복되는 부분의 세 부분으로 표현될 수 있다는 것을 알고 있습니다. 숫자는 다음 세 가지 방법 중 하나로 표시됩니다. -

  • 정수 부분만(예:0, 12, 123)

  • IntegerPart.NonRepeatingPart (예:0.5, 1.0, 2.12, 2.0001)

  • IntegerPart.NonRepeatingPart(RepeatingPart>) (예:0.1(6), 0.9(9), 0.00(1212))

예를 들어 0.1(6) 또는 0.1666(6) 또는 0.166(66)은 모두 1/6의 올바른 표현입니다.

따라서 입력이 S ="0.(52)" 및 T ="0.5(25)"와 같으면 출력은 True가 됩니다.

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

  • 함수 f()를 정의하면 S가 필요합니다.

    • i :=S

      의 '(' 인덱스
    • i가 S 길이의 범위에 있으면 -

      • base :=인덱스 0에서 i - 1까지 S의 부분 문자열

      • rep :=인덱스 i + 1에서 (S의 길이 - i - 3)까지의 S의 부분 문자열

      • initialize j :=0의 경우 j <20일 때 업데이트(j를 1만큼 증가), −

        • 기본 :=기본 + 반복

      • 실제 값으로 기본 반환

    • S를 실제 값으로 반환

  • 주요 기능에서 다음을 수행하십시오 -

  • f(S)가 f(T)와 같으면 true를 반환

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

예시

#include <bits/stdc++.h>
using namespace std;class Solution {
   public:
   bool isRationalEqual(string S, string T){
      return f(S) == f(T);
   }
   double f(string S){
      auto i = S.find("(");
      if (i != string::npos) {
         string base = S.substr(0, i);
         string rep = S.substr(i + 1, S.length() - i - 2);
         for (int j = 0; j < 20; ++j)
         base += rep;
         return stod(base);
      }
      return stod(S);
   }
};
main(){
   Solution ob;
   cout << (ob.isRationalEqual("0.(52)", "0.5(25)"));
}

입력

"0.(52)", "0.5(25)"

출력

1