Giả sử chúng ta có một số num. Chúng ta phải chuyển nó thành chữ số la mã tương đương của nó. Chữ số La mã chứa các ký hiệu và giá trị như bên dưới -
- "Tôi" =1
- "V" =5
- "X" =10
- "L" =50
- "C" =100
- "D" =500
- "M" =1000
Các ký hiệu này thường được viết từ lớn nhất đến nhỏ nhất, theo thứ tự từ trái sang phải và có thể được tính bằng cách tính tổng các giá trị của tất cả các ký hiệu. Nhưng có một số trường hợp đặc biệt, khi biểu tượng có giá trị thấp hơn nằm bên trái của biểu tượng có giá trị cao hơn, biểu tượng của nó cho biết giá trị thấp hơn được trừ cho giá trị cao hơn.
Đây là những ví dụ về những trường hợp như vậy -
- "I" đứng trước "V", giá trị 4.
- "I" đứng trước "X", giá trị 9.
- "X" đứng trước "L", giá trị 40.
- "X" đứng trước "C", giá trị 90.
- "C" đứng trước "D", giá trị 400.
- "C" đứng trước "M", giá trị 900.
Trong chữ số La Mã cũng có một số quy tắc -
- Không có biểu tượng nào được lặp lại quá 3 lần.
- Các ký hiệu "V", "L" và "D" không được lặp lại.
Vì vậy, nếu đầu vào là n =1520, thì đầu ra sẽ là "MDXX", vì "MDXX" cho biết 1000 + 500 + 10 + 10 =1520.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- res:=chuỗi trống
- table =danh sách chứa các cặp (val, ký hiệu) ở định dạng này, trong đó val là giá trị và ký hiệu là ký hiệu được liên kết [(1000, "M"), (900, "CM"), (500, " D "), (400," CD "), (100," C "), (90," XC "), (50," L "), (40," XL "), (10," X " ), (9, "IX"), (5, "V"), (4, "IV"), (1, "I")]
- đối với mỗi cặp (cap, la mã) trong bảng, thực hiện
- d:=tầng num / cap
- m:=num mod cap
- res:=res + roman * d
- num:=m
- trả lại res
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
def solve(num): res = "" table = [ (1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100, "C"), (90, "XC"), (50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I"), ] for cap, roman in table: d, m = divmod(num, cap) res += roman * d num = m return res num = 1520 print(solve(num))
Đầu vào
1520
Đầu ra
MDXX