분수의 분자와 분모를 나타내는 두 개의 정수가 있다고 가정하고 문자열 형식의 분수를 찾아야 합니다. 소수 부분이 반복되는 경우 반복되는 부분을 괄호로 묶습니다. 따라서 분자가 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)