Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어로 로마 숫자를 십진수로 변환하는 프로그램


C 언어를 활용하면 로마 숫자를 간단한 알고리즘만으로 십진수로 변환할 수 있습니다. 이 글에서는 변환 원리, 단계별 알고리즘, 전체 소스 코드, 그리고 실제 실행 결과까지 차근차근 살펴보겠습니다.

로마 숫자 변환의 기본 원리

로마 숫자는 다음 일곱 가지 기호로 구성되며, 각 기호는 고유한 값을 가집니다.

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

기본적으로 왼쪽에서 오른쪽으로 값을 더해 나가지만, 작은 값이 큰 값보다 앞에 오면(예: IV = 4, IX = 9) 해당 값을 빼는 감산 규칙이 적용됩니다. 따라서 인접한 두 문자의 크기를 비교하는 것이 이 알고리즘의 핵심입니다.

알고리즘

  1. 시작
  2. 입력 − 프로그램 실행 중에 로마 숫자를 입력받습니다.
  3. 길이 계산 − length := strlen(roman)
  4. 문자별 값 저장 − i = 0부터 length-1까지 반복하면서 switch 문으로 각 문자에 해당하는 값을 배열 d[i]에 저장합니다.
    m/M → 1000, d/D → 500, c/C → 100, l/L → 50, x/X → 10, v/V → 5, i/I → 1
  5. 감산 규칙 처리 − i = 0부터 length-1까지 반복합니다.
    • (i == length-1) 또는 (d[i] >= d[i+1])이면 → deci += d[i]
    • 그렇지 않으면 → deci -= d[i]
  6. 출력 − 로마 숫자에 해당하는 십진수 값을 출력합니다.
  7. 종료

C 프로그램

다음은 로마 숫자를 십진수로 변환하는 C 프로그램의 전체 소스 코드입니다. strlen 함수를 사용하기 위해 원본에 없던 <string.h> 헤더를 추가하고, main 함수에 반환 타입을 명시했습니다.

#include <stdio.h>
#include <string.h>
int main(){
    char roman[30];
    int deci=0;
    int length,i,d[30];
    printf("The Roman equivalent to decimal\n");
    printf("Decimal:.........Roman\n");
    printf("%5d............%3c\n",1,'I');
    printf("%5d............%3c\n",5,'V');
    printf("%5d............%3c\n",10,'X');
    printf("%5d............%3c\n",50,'L');
    printf("%5d............%3c\n",100,'C');
    printf("%5d............%3c\n",500,'D');
    printf("%5d............%3c\n",1000,'M');
    printf("Enter a Roman numeral:");
    scanf("%s",roman);
    length=strlen(roman);
    for(i=0;i<length;i++){
        switch(roman[i]){
            case 'm':
            case 'M': d[i]=1000; break;
            case 'd':
            case 'D': d[i]= 500; break;
            case 'c':
            case 'C': d[i]= 100; break;
            case 'l':
            case 'L': d[i]= 50; break;
            case 'x':
            case 'X': d[i]= 10; break;
            case 'v':
            case 'V': d[i]= 5; break;
            case 'i':
            case 'I': d[i]= 1;
        }
    }
    for(i=0;i<length;i++){
        if(i==length-1 || d[i]>=d[i+1])
            deci += d[i];
        else
            deci -= d[i];
    }
    printf("The Decimal equivalent of Roman numeral %s is %d", roman, deci);
}

실행 결과

위 프로그램을 컴파일하여 실행하면 다음과 같은 결과가 출력됩니다. 여기서는 로마 숫자 M을 입력했습니다.

The Roman equivalent to decimal
Decimal:.........Roman
1............ I
5............ V
10............ X
50............ L
100............ C
500............ D
1000............ M
Enter a Roman numeral: M
The Decimal equivalent of Roman Numeral M is 1000

동작 방식 예시

조금 더 복잡한 예로 MCMXCIV(1994)를 입력했다고 가정해 보겠습니다. 첫 번째 반복문에서 각 문자가 d[] 배열에 [1000, 100, 1000, 10, 100, 1, 5]로 저장되고, 두 번째 반복문에서 인접 값끼리 비교하여 1000 + (−100) + 1000 + (−10) + 100 + (−1) + 5 = 1994가 계산됩니다. 이처럼 작은 값이 큰 값 앞에 올 때 이를 빼는 방식으로 감산 규칙이 자연스럽게 처리됩니다.