[백준] 1312번: 소수
링크: www.acmicpc.net/problem/1312
1312번: 소수
피제수(분자) A와 제수(분모) B가 있다. 두 수를 나누었을 때, 소숫점 아래 N번째 자리수를 구하려고 한다. 예를 들어, A=3, B=4, N=1이라면, A÷B=0.75 이므로 출력 값은 7이 된다.
www.acmicpc.net
소수
문제
피제수(분자) A와 제수(분모) B가 있다. 두 수를 나누었을 때, 소숫점 아래 N번째 자리수를 구하려고 한다. 예를 들어, A=3, B=4, N=1이라면, A÷B=0.75 이므로 출력 값은 7이 된다.
입력
첫 번째 줄에 A와 B(1≤A, B≤100,000), N(1≤N≤1,000,000)이 공백을 경계로 주어진다.
출력
A÷B를 했을 때, 소숫점 아래 N번째 수를 출력한다.
문제 접근
해당 문제는 나눗셈의 과정을 논리적으로 해석하는 것을 묻는 문제인것 같다.
예시를 들어 a=3 b=4라고 할때 a를 b로 나누는 과정을 살펴보면, a가 b보다 작기때문에 a에 0을 붙인다.(10을 곱한다.) 이제 a가 b보다 커졌으니 b로 나눈다. 나눈 몫은 7이고 나머지는 2이다. 나머지를 다시 a라 했을때, a=2, b=4이므로 또 나눈다. a가 b보다 작기때문에 a에 0을 붙인다.(10을 곱한다.) a가 b보다 커졌으니 a를 b로 나눈다. 몫은 4 나머지는 0이다.
즉 3/4 = 0.75인 것이다.
위 과정을 정리해보면
1. a가 b보다 작으면 a에 10을 곱한다.
2. a를 b로 나눈 몫과 나머지를 구한다.
3. 몫은 소수점의 자리가 되고 나머지는 a로 갱신된다.
4. 다시 1번으로 돌아간다.
위 과정을 반복하면 된다.
이를 코드로 표현하면 아래와 같다.
코드
"""
백준 알고리즘 1157번: 단어 공부
https://www.acmicpc.net/problem/1157
"""
import sys
def calc(a,b,n):
li = []
i = 0
while i != n+1:
# a가 b보다 작을때
if a < b:
a *= 10
li.append(0)
# 몫과 나머지를 구해 a를 갱신한다.
quot = int(a / b)
rema = int(a % b)
li.append(quot)
a = rema*10
i += 1
return li[n]
def main():
a, b, n = sys.stdin.readline().split()
a = int(a); b = int(b); n = int(n)
print(calc(a,b,n))
if __name__ == "__main__":
main()