[BOJ][C++] 백준 2089번 -2진수

Updated:

2089번 -2진수

1. 문제 정보

백준 온라인 저지 [2089번 -2진수] 문제의 링크입니다.

문제

-2진법은 부호 없는 2진수로 표현이 된다. 2진법에서는 20, 21, 22, 23이 표현 되지만 -2진법에서는 (-2)0 = 1, (-2)1 = -2, (-2)2 = 4, (-2)3 = -8을 표현한다. 10진수로 1부터 표현하자면 1, 110, 111, 100, 101, 11010, 11011, 11000, 11001 등이다.
10진법의 수를 입력 받아서 -2진수를 출력하는 프로그램을 작성하시오.

입력

첫 줄에 10진법으로 표현된 수 N(-2,000,000,000≤N≤2,000,000,000)이 주어진다.

출력

-2진법 수를 출력한다.


예제 입력1

-13

예제 출력1

110111

시간 / 메모리 제한

2초 / 128MB


2. 생각

  1. 주어진 문제가 어떤 의미인지 먼저 생각해봤습니다.
-32 16 -8 4 -2 1
1           1
2       1 1 0
3       1 1 1
4       1 0 0
5       1 0 1
6   1 1 0 1 0
7   1 1 0 1 1
8   1 1 0 0 0
9   1 1 0 0 1
  1. 문제를 푸는 방법을 생각하며 검색을 하다보니 특이한 점을 발견했습니다. c언어의 기반인 c++ 언어는 몫을 구할 때 내림 방식이 아닌 버림 방식을 택하는 것이었습니다.
  C언어 python
나머지 구하는 방식 소수점 버림 소수점 내림(그 수보다 작은 정수로)
예) 13 / 2 6.5 -> 6 6.5 -> 6
예) -13 / 2 -6.5 -> -6 -6.5 -> -7
예) 13 / -2 -6.5 -> -6 -6.5 -> -7
예) 13 / -2 6.5 -> 6 6.5 -> 6

2089_2 2089_1

  1. 양수를 양수로 나누는 경우와 음수를 음수로 나누는 경우에는 버림과 내림 방식 모두 문제가 없지만,
    음수를 양수로 나누거나 양수를 음수로 나누는 경우에는 해석의 차이가 발생할 수 있습니다.

  2. -2진수를 구하는 경우에는 내림 방식을 취해줘야 정확한 값을 계산 할 수 있습니다. 따라서 n이 홀수인 경우 내림을 할 수 있도록 (n-1) / -2로 계산을 합니다.
    (n이 짝수인 경우에는 나머지가 0이므로 문제 없음, ex) 6/2 = 3, 6/-2 = -3)

+ plus

n이 양수   n이 음수  
n/-2 n%-2 n/-2 n%-2
음수 몫 0 or 1 양수 몫 0 or -1
n이 짝수   n이 홀수  
n/-2 n%-2 n/-2 n%-2
양수 or 음수 or 0 0 양수 or 음수 or 0 1 or -1

3. 소스코드 (C++)


터미널의 입출력 화면 예제1

2089_3 2089_4


References.

http://blog.naver.com/PostView.nhn?blogId=babobigi&logNo=220435679402&redirect=Dlog&widgetTypeCall=true https://soyoja.com/88