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