본문 바로가기

Beakjoon/math

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

문제

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

코드

#include <iostream>
#include <string>

using namespace std;

int main(){
  int n;
  cin >> n;
  if(n==0){
    cout << "0";
    return 0;
  }
  string result="";
  while(n!=0){
    if(n%-2==0){
      result="0"+result;
      n/=-2;
    }else{
      result="1"+result;
      n=(n-1)/-2;
    }
  }
  cout << result;
  return 0;
}

정리

음수와 양수의 사이의 몫을 구할 때 프로그래밍 언어마다 나오는 값이 다르다는 것을 알게 되었다.

예를 들어 C,C++,Java와 같은 프로그래밍 언어에서는 10/-3=-3이 나오고 Python, Ruby와 같은 프로그래밍 언어에서는 10/-3=-4가 나온다. 즉 C,C++,Java에서는 몫을 구할 때 버림 방식을 사용하고 Python, Ruby에서는 몫을 구할 때 내림 방식을 사용한다.

-2진수를 구하기 위해서는 내림방식을 취해주어야 올바른 값을 계산할 수 있다. 내가 사용하는 언어는 C++이기 때문에 나누어떨어지지 않을 경우 n-1로 코드상에서 내림처리를 해주어야 한다. 즉, n=(n-1)/-2로 표현할 수 있다.

참조

https://minyeok2ee.gitlab.io/boj/boj-2089/

https://soyoja.com/88