Study hard

(c++)백준 2089번: -2진수 본문

백준/여러가지 문제들

(c++)백준 2089번: -2진수

Nimgnoej 2020. 6. 17. 20:36

https://www.acmicpc.net/problem/2089

 

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로 나눈 후 -를 붙여주면 된다. ex) 4 / -2 = -2, - (4 / 2) = -2 

그리고 -2진수 값을 저장하는 stack에는 0을 저장한다.

 

나누어야 할 값이 짝수가 아니면서 음수인 경우는 음수를 양수로 바꾸고 1을 더해준 후 2로 나눠주면 된다.

ex) -5 / -2 = 3, (5 + 1) / 2 = 3

그리고 -2진수 값을 저장하는 stack에는 1을 저장한다.

 

나누어야 할 값이 짝수가 아닌 양수인 경우는 짝수인 경우와 같이 2로 나눈 후 -를 붙여주면 된다.

ex) 3 / -2 = -1, -(3 / 2) = -1

그리고 -2진수 값을 저장하는 stack에는 1을 저장한다.

 

#include <iostream>
#include <stack>
using namespace std;

long long Dex;

void solution() {
	cin >> Dex;
	if (Dex == 0) {
		cout << 0 << endl;
		return;
	}
	stack<int>Bin;
	while (Dex != 0) {
		//나누어질 값이 2의 배수일 때
		if (Dex % 2 == 0) {
			Bin.push(0);
			Dex = -(Dex / 2);
		}
		else {
			if (Dex < 0)
				Dex = (-Dex + 1) / 2;//ex)-5/-2 = 3
			else
				Dex = -(Dex / 2);
			Bin.push(1);
		}
	}
	while (!Bin.empty()) {
		cout << Bin.top();
		Bin.pop();
	}
	cout << endl;
}

int main() {
	solution();
	return 0;
}