※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2089번 문제인 -2진수이다.
문제는 아래 링크를 확인하자.
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, 110
www.acmicpc.net
이 문제에서 말하는 -2진수는 negabinary number으로 검색하면 많은 자료를 구할 수 있을 것이다.
일반적인 이진수와 다르게, negabinary number의 각 자리는 (-2)의 거듭제곱을 나타낸다.
negabinary number은 양의 정수와 음의 정수를 -와 같은 부호의 표기를 따로 하지 않고 0과 1로 같이 나타낼 수 있다는 점에서 생각해 볼 가치가 있다.
10진수를 negabinary number로 바꾸는 것은 어렵지 않은데, 일반적인 이진수를 찾듯이 하다가 음의 지수를 나타내는 자리에서는 그 자리에 해당하는 숫자를 한자리 더해주는 것을 반복하면 된다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <stack>
using std::cin; using std::cout;
using std::stack;
stack<int> negabinary;
int main()
{
int N; cin >> N;
bool sign = 0; // 0: positive, 1: negative
while (N != 0) {
if (N & 1) negabinary.push(1);
else negabinary.push(0);
if (sign) {
N++;
sign = false;
}
else sign = true;
N >>= 1;
}
if (negabinary.empty()) cout << 0; // 0의 경우 빈 스택이므로 예외처리
else {
while (!negabinary.empty()) {
cout << negabinary.top();
negabinary.pop();
}
}
return 0;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 20171 // C++] Dessert Café (0) | 2021.03.27 |
---|---|
[BOJ 2533 // C++] 사회망 서비스(SNS) (0) | 2021.03.26 |
[BOJ 11275 // C++] 트리의 부모 찾기 (0) | 2021.03.24 |
[BOJ 1915 // C++] 가장 큰 정사각형 (0) | 2021.03.23 |
[BOJ 1759 // C++] 암호 만들기 (0) | 2021.03.22 |