우리가 사용하는 컴퓨터는 실수를 표현할 때 주로 "부동소수점" 방식을 활용하여 실수를 표현합니다.
이 방법은 일정한 데이터 용량 안에 넓은 범위의 실수를 표현할 수 있어서 널리 쓰이는 방식입니다.
하지만 부동소수점 방식은 실수를 정확한 실수값이 아닌 근삿값으로 저장한다는 단점이 있습니다.
실제로 파이썬에서 실수 0.1을 단순히 100자리까지 출력하면 다음과 같은 결과를 얻습니다.
0.1000000000000000055511151231257827021181583404541015625000000000000000000000000000000000000000000000
프로그래밍을 공부하고 있던 가영은 무리수가 아닌 유리수까지도
실수 자료형으로는 근삿값으로 표현할 수 밖에 없다는 사실에 분노했습니다.
가영을 위해 유리수와 알고 싶은 자릿수가 주어지면 이를 정확한 소수로 표현해주는 프로그램을 작성하세요.
[입력값 설명]
『첫 번째 줄에 분자를 의미하는 p와 분모를 의미하는 q가 주어집니다. (1 ≤ p < q ≤ 10¹²)
두 번째 줄에 소수점 이하로 출력해야 할 자릿수 n이 주어집니다. (1 ≤ n ≤ 10,000)』
[출력값 설명]
『첫 번째 줄에 주어진 유리수를 소수로 고쳐서 출력하되,
n+1번째 자리에서 반올림하여 정확히 소수점 이하 n자리를 출력합니다.
실수 오차를 허용하지 않음에 주의합니다.』
예제 입력1
10555 33000
3
예제 출력1
0.320
예제 입력2
10555 33000
100
예제 출력2
0.3198484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848484848
이 문제는 나누기와 소수, 유리수의 이해가 필요한 문제이다. 구현에 대해 아주 좋은 문제인거 같다.
import sys
sys.stdin=open('input.txt', 'r')
input = sys.stdin.readline
if __name__ == "__main__":
p, q = map(int, input().split())
n = int(input())
answer = ''
# 수를 n자리수 만큼 나눈값의 자리수들을 차례차례구한다
for _ in range(n):
p *= 10
k = int(p/q)
answer += str(k)
p -= k*q
p *= 10
k = int(p/q)
# n+1자리가 반올림 가능하면
if k >= 5:
answer = int(answer)+1 # 수로 바꿔서 1 더해줌
answer = str(answer)
answer = '0.'+answer
print(answer)