- 문제
유리수 분수를 소수로 나타내면, 소수점 아래 자리가 유한 개인 경우(1/8 = 0.125)와 어떤 자리에서부터 일정한 숫자가 한없이 되풀이 되는 경우(1/11 = 0.090909...)가 있다.
소수를 입력받은 뒤, 분수로 나타내는 프로그램을 작성하시오.
// 시간 제한: 1초, 메모리 제한: 128MB
- 입력
첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스의 개수는 100개를 넘지 않는다. 각 테스트 케이스는 한 줄에 소수가 하나씩 주어진다.
소수의 첫 두 자리는 "0."이다. 그 다음에는 숫자 0개~6개가 주어진다. 그 다음, 길이가 1과 9사이면서 괄호로 감싸져있는 수가 주어질 수도 있다. 이 수는 무한히 반복되는 자리를 의미한다.
항상 0이 아닌 자리가 하나는 주어지며, 괄호 안에 주어지는 수는 0이나 9로만 이루어져 있지 않다.
- 출력
각 테스트 케이스에 대해서, 입력으로 주어진 소수의 분수 표현을 출력한다. (분모와 분자는 서로소이어야 한다)
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
long long int t, idx, g, up, down;
string s;
long long int GCD(long long int n, long long int m) {
if (m == 0)return n;
return GCD(m, n % m);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> t;
while (t--) {
cin >> s;
s = s.substr(2);
idx = s.find('(');
if (idx == -1) {
up = stoll(s);
down = (long long int) pow(10, s.length());
} else {
string a = "", b = "";
for (int i = 0; i < idx; i++) {
a.push_back(s[i]);
}
for (int i = 0; i < s.length() - 1; i++) {
if (i == idx)
continue;
b.push_back(s[i]);
}
(a == "") ? up = stoll(b) : up = stoll(b) - stoll(a);
down = (long long int) pow(10, b.length()) - (long long int) pow(10, a.length());
}
g = GCD(up, down);
up /= g;
down /= g;
cout << up << "/" << down << "\n";
}
}
풀이