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. -1부터 -13까지 반복(거듭제곱 : power)
  2. 해당 power일 때 N을 2^power로 나눈 몫을 result에 추가
  3. 나머지를 N으로 갱신
  4. N == 0 이면 계산 이진수로 변환 완료 (반복 종료)
  5. -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))