사용 언어: python 3.7.4
문제
피제수(분자) 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를 B를 나눈 수에 10^n을 곱하면, 그 수의 일의 자릿수가 원하는 답이라는 식으로 접근했다.
하지만 n값이 커지자 오버플로우가 났다.
# 런타임 에러
a, b, n = map(float, input().split())
num = a/b
num = num*(10**n)
num = int(num%10)
print(num)
큰 수를 저장할 수 있는 타입을 찾다가 다른 블로그의 해답에 눈길이 끌려 봐버렸다.
직접 소수점을 계산하듯이 그림으로 그려보니 간단했다.
예를 들어, A가 25, B가 7, N을 3이라고 하자.
나머지에 10을 곱하고 다시 나머지에 10을 곱하는 과정을 거친 후, 3번째 나머지에 10을 곱한 값에 7을 나눈 몫이 구하고자 하는 소수점 값이다.
즉, A를 B로 나눈 나머지에 10을 곱하는 과정을 N-1번 거친 후, N번째 나머지에 10을 곱한 값에 B를 나눈 몫이 구하고자 하는 소수점 값이다.
a, b, n = map(int, input().split())
r = a%b
for i in range(n-1):
r = (r*10)%b
print((r*10)//b)
correct
메모리 | 시간 | 코드길이 |
---|---|---|
28776 KB | 196 ms | 106 B |
O(logN)
map(int, input().split())
x
오버플로우가 나면 타입 바꾸기 외에도 아예 접근 방식을 바꾸는 방법도 필요함을 느꼈다.
사람이 작은 수를 차례대로 처리하는 방법처럼 접근하는 법을 생각해봐야겠다.
수학적 사고를 그대로 코드로 옮기니까 좀 재밌다.