분수를 소수로

난이도

Gold 5

인증

문제

모든 유리수는 다음과 같이 특정한 수가 반복되는 순환 소수 형태로 표현될 수 있다.

[\frac{1}{3} = \frac{3}{9} = 0.3333333\dots = 0.\overline{3} \ \frac{1}{7} = \frac{142857}{999999} = 0.14285714285714\dots = 0.\overline {142857} \ \frac{3}{14} = \frac{2142855}{9999990} = 0.214285714285714 = 0.2\overline{142857}] 

위에서 분모가 9와 0으로 이루어진 부분을 보면 알 수 있듯이 순환 소수가 주어졌을 때 이를 분수로 바꾸는 방법은 공식화 되어있다. 하지만 공식의 형태가 아닌 분수가 주어졌을 때 이를 이용하기는 어려우므로 일반적으로 분수를 순환 소수로 바꾸는 가장 쉬운 방법은 나눗셈을 반복하는 것이다. 하지만 이 작업은 손으로 하기엔 너무 어려우니 이를 수행하는 프로그램을 작성해보자.

입력

입력의 첫 번째 줄에는 테스트 케이스의 수 T (1 ≤ T ≤ 15,000)가 주어진다.

이후 각 테스트 케이스에 대해 한 줄에 분자와 분모 (0 ≤ 분자 < 1024, 0 < 분모 < 1024)가 공백으로 구분되어 정수로 주어진다

출력

한 줄에 한 개씩 각 테스트 케이스에 대한 순환소수를 출력한다(순환부는 괄호로 감싸서 표시한다).

예제 입력

6
1 2
1 7
10 5
11 5
995 476
991 994

예제 출력

0.5(0)
0.(142857)
2.(0)
2.2(0)
2.09(033613445378151260504201680672268907563025210084)
0.9(969818913480885311871227364185110663983903420523138832997987927565392354124748490945674044265593561368209255533199195171026156941649899396378269617706237424547283702213279678068410462776659959758551307847082494)

해설 및 후기

얕잡아 봤다가 상당히 오래 걸렸다. ‘졸려’문제와 비슷하게 순환되는 경우를 찾아야 하는데, 나머지가 같은 경우를 기준으로 순환소수를 판별했다.

제출 코드

n = int(input())
for i in range(n):
    a, b = map(int, input().split())
    nums = []
    f = a//b
    isVis = [-1 for _ in range(b)]
    toMod = a%b
    last = 0
    has = False
    t = 0
    isVis[toMod] = t
    t+=1

    while(toMod != 0):
        toMod *= 10
        d = toMod // b
        m = toMod % b

        nums.append(d)

        if(isVis[m] != -1):
            has = True
            last = isVis[m]
            break
            
        isVis[m] = t
        t += 1
        toMod = m


    print(f,end=".")
    if(has):
        for j in range(last):
            print(nums[j],end="")
        print("(",end="")
        for j in range(last, len(nums)):
            print(nums[j],end="")
        print(")")
    else:
        for j in nums:
            print(j,end="")
        print("(0)")