분자/분모 형식의 유리수를 나타내는 분자와 분모라는 두 개의 숫자가 있다고 가정합니다. 십진수 표현을 문자열로 찾아야 합니다. 반복되는 숫자가 있으면 대괄호로 묶습니다.
따라서 입력이 numerator =164 denominator =3과 같으면 출력은 "54.(6)"이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 분자가 0과 같으면 -
- "0" 반환
- 배열 정의
- 분자 <0 및 분모> 0 또는 분자> 0 및 분모 <0이면 −
- as 끝에 '-' 삽입
- 제수 :=|분자|
- 배당금 :=|분모|
- 나머지 :=제수 모드 피제수
- x :=(제수 / 피제수)를 문자열로 변환
- 초기화 i의 경우:=0, i
- and 끝에 x[i] 삽입
- 문자열로 반환
- 나머지가 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)