Cho số thập phân n, chuyển sang số La Mã. n trong khoảng 1 đến 4000. Bảng số La Mã:
| Số | Chữ số La Mã |
|---|---|
| 1 | I |
| 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 |
VD: n = 859 -> DCCCLIX
Giải pháp:
- Mảng lưu chữ số La Mã và giá trị tương ứng (nume array)
- Đệ quy: hàm decToRom(nume, num)
- Nếu num != 0:
- max := giá trị lớn nhất trong nume không lớn hơn num
- Nối ký hiệu của max vào kết quả
- num := num - max value
- Gọi đệ quy decToRom(nume, num)
Ví dụ
#includetypedef struct{ char *sym; int val; }numeral; int maxNume(numeral *nu, int num){ int i, index; for(i = 0; i < 15; i++){ if(nu[i].val <= num) index = i; } 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; decToRoman(nu, num); } } 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){ printf("The Roman equivalent of %d is ", number); decToRoman(nume, number); } else{ printf("Invalid Input"); } printf("\n"); }
Đầu vào
570 3574
Đầu ra
DLXX MMMDLXXIV