두 개의 문자열이 있다고 가정합니다. 이들은 각각 양의 유리수를 나타내는 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