Algorithm Problem Solving/SWExpertAcademy
Programming Advanced [파이썬 S/W 문제해결 구현01 시작하기] SWEA 5186 - 이진수2 (D2)
cys4585
2021. 4. 13. 11:42
Problem
0보다 크고 1미만인 십진수 N을 이진수로 바꾸려고 한다. 예를 들어 0.625를 이진 수로 바꾸면 0.101이 된다.
N = 0.625
0.101 (이진수)
= 1*2-1 + 0*2-2 + 1*2-3
= 0.5 + 0 + 0.125
= 0.625
N을 소수점 아래 12자리 이내인 이진수로 표시할 수 있으면 0.을 제외한 나머지 숫자를 출력하고, 13자리 이상이 필요한 경우에는 ‘overflow’를 출력하는 프로그램을 작성하시오.
[입력]
첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50
다음 줄부터 테스트 케이스의 별로 소수점 아래가 12자리 이내인 N이 주어진다.
[출력]
각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.
Solving
아이디어
- -1부터 -13까지 반복(거듭제곱 : power)
- 해당 power일 때 N을 2^power로 나눈 몫을 result에 추가
- 나머지를 N으로 갱신
- N == 0 이면 계산 이진수로 변환 완료 (반복 종료)
- -13까지 반복할 동안 N == 0이 되지 않으면 overflow
코드
for tc in range(1, int(input()) + 1):
N = float(input())
result = ''
# 2의 1승부터 ~ 2의 13승까지 계산
for power in range(-1, -14, -1):
result += str(int(N // (2**power)))
N %= (2**power)
# N == 0 이면 이진수로 변환이 완료된 것 -> 반복문 종료
if N == 0:
break
# 반복문이 강제종료되지 않았다는 것 -> 이진수 변환에 13자리 이상이 필요한 것 -> overflow
else:
result = 'overflow'
print('#{} {}'.format(tc, result))