[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. 생각
- 주어진 문제가 어떤 의미인지 먼저 생각해봤습니다.
수 | -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 |
- 문제를 푸는 방법을 생각하며 검색을 하다보니 특이한 점을 발견했습니다. 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 |
-
양수를 양수로 나누는 경우와 음수를 음수로 나누는 경우에는 버림과 내림 방식 모두 문제가 없지만,
음수를 양수로 나누거나 양수를 음수로 나누는 경우에는 해석의 차이가 발생할 수 있습니다. -
-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++)
References.
http://blog.naver.com/PostView.nhn?blogId=babobigi&logNo=220435679402&redirect=Dlog&widgetTypeCall=true https://soyoja.com/88