Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

C에서 로마자로 정수

<시간/>

10진수 n이 주어지면 이것을 로마 숫자로 변환해야 합니다. 값 n은 1에서 4000 사이입니다. 이것은 일부 로마 숫자입니다.

숫자
숫자
1
나는
4
IV
5
V
9
IX
10
X
40
XL
50
L
90
XC
100
C
400
CD
500
D
900
CM
1000
M
4000
MMMM

따라서 숫자 n =859이면 로마 숫자는 DCCCLIX가 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다.

  • 주어진 목록에 대한 숫자와 해당 값을 저장할 배열을 정의합니다. 이를 숫자 배열이라고 합니다.
  • 재귀적 접근 방식을 사용하고 있으며 decToRom() 함수가 사용됩니다. 이것은 num 배열과 숫자 num을 사용합니다.
  • decToRom()은 다음과 같습니다.
  • num이 0이 아니면
    • max :=num보다 크지 않은 num 배열에서 최대값 찾기
    • 결과 문자열에 해당 최대값 추가
    • num :=num – 최대값
    • decToRom(숫자, 숫자)

예시

더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −

#include<stdio.h>
typedef struct{
   char *sym;
   int val;
}numeral;
int maxNume(numeral *nu, int num){
   int i, index;
   for(i = 0; i<15; i++){//15 numerals in array
      if(nu[i].val <= num)
         index = i;
   }
   //gretest value numeral index, not greater than number
   return index;
}
void decToRoman(numeral *nu, int num){
   int max;
   if(num != 0){
      max = maxNume(nu, num);
      printf("%s", nu[max].sym);
      num -= nu[max].val;//decrease number
      decToRoman(nu, num);//recursively print numerals
   }
}
main(){
   int number;
   numeral nume[15] = {{"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},{"MMMM",4000},{"V'",5000}};
   printf("Enter a decimal number: ");
   scanf("%d", &number);
   if(number >0 && number <= 5000){//checking input number
      printf("The Roman equivalent of %d is ", number);
      decToRoman(nume, number);
   }
   else{
      printf("Invalid Input");
   }
   printf("\n");
}

입력

570
3574

출력

DLXX
MMMDLXXIV