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