C++의 로마 숫자 변환기

Namita Chaudhary 2023년10월12일
  1. C++의 로마 숫자 변환기
  2. C++에서 10진수를 로마 숫자로 변환
  3. 10진수를 로마 숫자로 변환하는 C++ 코드 예제
  4. 결론
C++의 로마 숫자 변환기

오늘날 세계에는 다양한 방식으로 숫자를 나타내는 데 도움이 되는 여러 숫자 체계가 있습니다. 그중 하나가 로마 숫자 체계입니다.

고대 로마인들은 숫자를 세고 일상 활동을 수행하기 위해 그것들을 발명했습니다. 이 기사에서는 로마 숫자 체계와 십진수를 로마 숫자로 변환하는 프로그램에 대해 설명합니다.

C++의 로마 숫자 변환기

로마 숫자는 계산 및 기타 목적을 위한 특정 형식의 숫자를 나타냅니다.

당신은 학교에서 이 로마 숫자에 대해 들어봤을 것이고 시계에서 실제적인 예를 보았을 것입니다. 로마 숫자는 종종 시계의 숫자를 나타냅니다.

로마 숫자 체계는 라틴 알파벳의 7개 문자 조합으로 표시됩니다. 7개의 문자 또는 기호 각각에는 명확한 값이 붙어 있습니다.

7개의 문자와 해당 특정 값이 아래에 지정되어 있습니다.

I - 1
V - 5
X - 10
L - 50
C - 100
D - 500
M - 1000

그러나 한 가지 기억해야 할 점은 1000 이후에는 10000을 나타내는 기호가 없다는 것입니다. 따라서 로마 숫자가 나타낼 수 있는 가장 높은 숫자는 3999입니다.

이제 십진수를 로마 숫자로 변환하는 방법에 대해 이야기하겠습니다.

로마 숫자의 숫자는 왼쪽에서 오른쪽으로 내림차순으로 기록됩니다. 그러나 경우에 따라 (IIII 또는 XXXX)와 같이 동일한 4개의 연속 문자가 반복되는 것을 방지하기 위해 빼기 표기법을 따릅니다. 빼기 표기법은 4와 9가 포함된 숫자와 함께 사용됩니다.

빼기 표기법에서 I는 V 또는 X 앞에 배치되어 IV(4) 또는 IX(9)가 됩니다. 마찬가지로 XL 또는 C 앞에 배치되어 XL 또는 XC로 만듭니다.

따라서 빼기 표기법의 기호는 두 개의 기호를 결합하여 만들어집니다. 따라서 빼기 표기법도 포함하는 로마 숫자를 살펴보겠습니다.

SYMBOL        Number
I             1
IV            4
V             5
IX            9
X             10
XL            40
L             50
XC            90
C             100
CD            400
D             500
CM            900
M             1000

C++에서 10진수를 로마 숫자로 변환

정수를 로마 숫자로 변환하는 절차는 다음과 같습니다.

  1. 주어진 십진수가 0이 될 때까지 아래 과정을 반복합니다.
  2. 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 순으로 10진수와 기준값을 비교해야 합니다.
  3. 기준값이 주어진 십진수(가장 큰 기준값)보다 작거나 같으면 십진수를 기준값으로 나눕니다.
  4. 이제 변수의 몫인 기준 값의 해당 기호를 추가합니다. 예를 들어, 몫이 3으로 나오고 기본 값이 10이면 10에 해당하는 표현, 즉 X가 답에서 XXX로 세 번 반복됩니다.
  5. 단, 나머지는 추가 분할을 위한 새로운 번호가 됩니다.
  6. 십진수가 0이 될 때까지 기호가 붙은 변수가 답을 담고 있습니다.

위의 알고리즘을 사용하여 로마 숫자로 변환할 소수점으로 숫자 2954를 사용하겠습니다.

출력:

MMCMLIV

설명:

스테이지 1:

  1. 처음에 십진수는 2954입니다.
  2. 2954>=1000이므로 가장 큰 기준값은 1000에 해당합니다.
  3. 2954를 1000으로 나누면 몫 = 2, 나머지 = 954가 됩니다. 1000에 해당하는 기호는 M이므로 두 번 반복됩니다.
  4. 따라서 현재 결과는 MM과 같습니다.
  5. 나머지는 추가 나눗셈을 수행하기 위한 새로운 숫자가 됩니다.

2단계:

  1. 이제 숫자는 954가 됩니다.
  2. 기준값 1000>954>=900과 비교합니다. 따라서 가장 큰 기준 값은 900입니다.
  3. 954를 900으로 나누면 몫 = 1, 나머지 = 54가 됩니다. 900에 해당하는 기호는 CM이므로 한 번 추가됩니다.
  4. 따라서 결과는 이제 MMCM이 됩니다.
  5. 나머지는 추가 나눗셈을 수행하기 위한 새로운 숫자가 됩니다.

3단계:

  1. 이제 숫자는 54가 됩니다.
  2. 기준값 90>54>=50과 비교. 따라서 가장 큰 기준 값은 50입니다.
  3. 54를 50으로 나누면 몫 = 1이고 나머지 = 4가 됩니다. 50에 해당하는 기호는 L이므로 한 번 추가됩니다.
  4. 따라서 결과는 이제 MMCML이 됩니다.
  5. 나머지는 추가 나눗셈을 수행하기 위한 새로운 숫자가 됩니다.

4단계:

  1. 이제 숫자는 4가 됩니다.
  2. 기준값 5>4>=4와 비교합니다. 따라서 가장 큰 기본 값은 4입니다.
  3. 4를 4로 나누면 몫 = 1이고 나머지 = 0이 됩니다. 4에 해당하는 기호는 IV이므로 한 번 추가됩니다.
  4. 따라서 결과는 이제 MMCMLIV가 됩니다.
  5. 이제 나머지가 0이 되므로 반복이 중지되고 필요한 답이 있습니다.

10진수를 로마 숫자로 변환하는 C++ 코드 예제

C++에서 10진수를 로마 숫자로 변환하는 코드 예제를 살펴보겠습니다.

#include <bits/stdc++.h>
using namespace std;

int subDig(char n1, char n2, int i, char c[]) {
  c[i++] = n1;
  c[i++] = n2;
  return i;
}

int digit(char ch, int n, int i, char c[]) {
  for (int j = 0; j < n; j++) {
    c[i++] = ch;
  }
  return i;
}

int convertRoman(int num) {
  char c[10001];
  int i = 0;
  while (num != 0) {
    if (num >= 1000) {
      i = digit('M', num / 1000, i, c);
      num = num % 1000;
    } else if (num >= 500) {
      if (num < 900) {
        i = digit('D', num / 500, i, c);
        num = num % 500;
      } else {
        i = subDig('C', 'M', i, c);
        num = num % 100;
      }
    } else if (num >= 100) {
      if (num < 400) {
        i = digit('C', num / 100, i, c);
        num = num % 100;
      } else {
        i = subDig('C', 'D', i, c);
        num = num % 100;
      }
    } else if (num >= 50) {
      if (num < 90) {
        i = digit('L', num / 50, i, c);
        num = num % 50;
      } else {
        i = subDig('X', 'C', i, c);
        num = num % 10;
      }
    } else if (num >= 10) {
      if (num < 40) {
        i = digit('X', num / 10, i, c);
        num = num % 10;
      } else {
        i = subDig('X', 'L', i, c);
        num = num % 10;
      }
    } else if (num >= 5) {
      if (num < 9) {
        i = digit('V', num / 5, i, c);
        num = num % 5;
      } else {
        i = subDig('I', 'X', i, c);
        num = 0;
      }
    } else if (num >= 1) {
      if (num < 4) {
        i = digit('I', num, i, c);
        num = 0;
      } else {
        i = subDig('I', 'V', i, c);
        num = 0;
      }
    }
  }

  for (int j = 0; j < i; j++) {
    cout << c[j];
  }
}

int main() {
  int number = 2954;

  convertRoman(number);

  return 0;
}

출력:

MMCMLIV

위의 코드에서 if/else 조건을 사용하여 숫자 num과 기준 값을 비교하고 이를 기반으로 해당 변수를 답변에 추가했습니다.

그러나 뺄셈 표기법을 따르는 숫자는 답에 두 개의 문자 기호가 추가된 subDig 기능과 별도로 처리되었습니다.

위에서 논의한 코드는 상당히 깁니다. 따라서 코드가 이전에 논의된 것보다 훨씬 짧은 다른 접근 방식에 대해 논의해 보겠습니다.

접근법 2

이 접근 방식은 기본 값과 해당 기호를 별도로 배열에 저장하고 이를 반복하면서 사용하는 방식을 기반으로 합니다.

같은 코드를 보자.

#include <bits/stdc++.h>
using namespace std;

int convertRoman(int num) {
  int base_values[] = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};
  string symbols[] = {"I",  "IV", "V",  "IX", "X",  "XL", "L",
                      "XC", "C",  "CD", "D",  "CM", "M"};
  int i = 12;
  while (num > 0) {
    int quot = num / base_values[i];
    num = num % base_values[i];
    while (quot--) {
      cout << symbols[i];
    }
    i--;
  }
}
int main() {
  int number = 2543;
  convertRoman(number);
  return 0;
}

출력:

MMDXLIII

위의 코드에서 기본 값과 해당 기호를 배열에 저장한 다음 숫자를 기본 값과 내림차순으로 비교했습니다.

다음으로 가장 큰 밑의 값으로 숫자를 나누고 몫과 나머지를 구합니다. 이제 while 루프를 사용하여 해당 기호가 여러 번 인쇄됩니다.

결론

이 기사에서는 십진수를 로마 숫자로 변환하는 방법에 대해 설명했습니다. 로마 숫자는 십진수를 기호로 나타내는 방법입니다.

로마 숫자는 내림차순으로 왼쪽에서 오른쪽으로 씁니다. 그러나 몇 가지 경우에 더 작은 기호가 큰 기호 앞에 쓰여지는 빼기 표기법을 사용합니다.

이러한 경우는 숫자 4와 9에서 발생하며 이 문서에서 설명합니다.

관련 문장 - C++ Number