소수를 분수로 //5376

김동완·2022년 8월 3일
0

BAEKJOON

목록 보기
33/53
  • 문제
    유리수 분수를 소수로 나타내면, 소수점 아래 자리가 유한 개인 경우(1/8 = 0.125)와 어떤 자리에서부터 일정한 숫자가 한없이 되풀이 되는 경우(1/11 = 0.090909...)가 있다.
    소수를 입력받은 뒤, 분수로 나타내는 프로그램을 작성하시오.

    // 시간 제한: 1초, 메모리 제한: 128MB
  • 입력
    첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스의 개수는 100개를 넘지 않는다. 각 테스트 케이스는 한 줄에 소수가 하나씩 주어진다.
    소수의 첫 두 자리는 "0."이다. 그 다음에는 숫자 0개~6개가 주어진다. 그 다음, 길이가 1과 9사이면서 괄호로 감싸져있는 수가 주어질 수도 있다. 이 수는 무한히 반복되는 자리를 의미한다.
    항상 0이 아닌 자리가 하나는 주어지며, 괄호 안에 주어지는 수는 0이나 9로만 이루어져 있지 않다.
  • 출력
    각 테스트 케이스에 대해서, 입력으로 주어진 소수의 분수 표현을 출력한다. (분모와 분자는 서로소이어야 한다)

// Created by dongwan-kim on 2022/07/31.
#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";
    }
}

풀이

profile
KIM DONGWAN

0개의 댓글