Giới thiệu
Số La Mã là các số phi vị trí. Một số chữ số được đặt cùng nhau để tạo thành một số trong hệ La Mã. Ví dụ số 75 có thể biểu diễn như 75 = 50 + 10 + 10 + 5, nên chữ số La Mã là LXXV.
Trong bài toán này, một số được cung cấp ở dạng thập phân, nhiệm vụ của ta là chuyển đổi nó thành chuỗi chữ số La Mã.
Có các ký hiệu khác nhau và giá trị của chúng, như sau:
| I | IV | V | IX | X | XL | L | XC | C | CD | D | CM | M | MMMM | V' |
| 1 | 4 | 5 | 9 | 10 | 40 | 50 | 90 | 100 | 400 | 500 | 900 | 1000 | 4000 | 5000 |
Sử dụng bảng này, ta có thể dễ dàng tìm chữ số La Mã của một số cho trước.
Đầu vào và Đầu ra
Đầu vào: Số thập phân: 3569 Đầu ra: Số La Mã tương đương của 3569 là: MMMDLXIX
Thuật toán
decToRoman(nuList, num)
Đầu vào: Danh sách chữ số với giá trị, số cần chuyển sang La Mã.
Đầu ra: Chữ số La Mã cho số cho trước.
Begin
if num ≠ 0, then
max := lấy giá trị chữ số lớn nhất, không lớn hơn số
hiển thị nuList[max].symbol
num := num – nuList[max].value
decToRoman(nuList, num)
End
Ví dụ (C++)
#include <iostream>
using namespace std;
struct numeral {
string sym;
int val;
};
int maxNume(numeral nu[], int num) {
int index;
for(int i = 0; i < 15; i++) // 15 chữ số trong mảng
if(nu[i].val <= num)
index = i; // chỉ số chữ số lớn nhất, không lớn hơn số
return index;
}
void decToRoman(numeral nu[], int num) {
int max;
if(num != 0) {
max = maxNume(nu, num);
cout << nu[max].sym;
num -= nu[max].val; // giảm số
decToRoman(nu, num); // đệ quy in chữ số
}
}
int 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}
};
cout << "Enter a decimal number: "; cin >> number;
if(number > 0 && number <= 5000) { // kiểm tra số nhập
cout << "The Roman equivalent of " << number << " is: ";
decToRoman(nume, number);
} else {
cout << "Invalid Input";
}
}
Kết quả
Enter a decimal number: 3569 The Roman equivalent of 3569 is: MMMDLXIX