Římský zápis používá sedm číslic – I, V, X, L, L, D, M. Pro vyjádření čísla n v římské notaci vezměme čísla jeho jednotek n 0, desítek n 1, stovek n 2 a tisíců n 3. Nejprve si zapišme počet jednotek v římské notaci. Pro 0 ⩽ n 0 ⩽ 3 jednoduše zapíšeme číslo I (jedna) n 0 krát za sebou. Pro 4 ⩽ n 0 ⩽ 8 zapíšeme číslo V (to znamená pět) a přičteme k němu tolik číslic I, kolik je n 0 více nebo méně než pět, a pokud více, pak vpravo, a pokud méně , pak vlevo. Nakonec zapíšeme n 0 = 9 jako IX (X značí deset, I vlevo ukazuje, že desítce chybí jedna).
Totéž uděláme s počtem desítek n 1, jen místo čísel I =1, V =5, C =10 použijeme X =10, L =50, C =100.
Pro počet stovek n 2 platí stejná pravidla, pro záznam se používají čísla C = 100, D = 500, M = 1000.
Pro tisíce římských číslic bude stačit pouze 0 ⩽ n 3 ⩽ 3, takže dostanete buď M, MM, nebo MMM.
Tabulka 31.1. Zápis desetinných míst římskými číslicemi
| jednotky (n0) | desítky (n 1) | stovky (n 2) | tisíc (n 3) | |
|---|---|---|---|---|
| 1 | I | X | C | M |
| 2 | II | XX | CC | MM |
| 3 | III | XXX | CCC | MMM |
| 4 | IV | XL | CD | |
| 5 | V | L | D | |
| 6 | VI | LX | DC | |
| 7 | VII | LXX | DCC | |
| 8 | VIII | LXXX | DCC | |
| 9 | IX | XC | CM |
Nyní dáme dohromady záznamy pro n 3, n 2, n 1, n 0 v uvedeném pořadí. Římské číslo je připraveno.
Například číslo 1987 se zapisuje jako MCMLXXXVII. Zde 1000 = M, 900 = CM, 80 = LXXX a 7 = VII.
Nevýhoda římského zápisu je viditelná: pomocí šesti číslic umožňuje reprezentovat čísla ne více než 3999.
Rozbor pravidel pro převod čísel do římského zápisu ukazuje, že stačí zapsat každou z desetinných číslic daného čísla římskými číslicemi s přihlédnutím k číslu jeho číslice a výsledné položky pak poskládat. Pravidla pro zápis desetinné číslice pomocí římských číslic jsou přibližně stejná – pouze množina římských číslic používaných pro zápis se mění v závislosti na číslici. Pro jednotky je to I, V, X, pro desítky – X, L, C, pro stovky – C, D, M, pro tisíce – pouze M (protože pro pět a deset tisíc nejsou žádné číslice).
S ohledem na tuto okolnost by bylo rozumné implementovat formou procedury (říkejme tomu RomanHelper) převod desetinné číslice na římský zápis. Postup bude mít dva parametry – desetinnou číslici a desetinné místo. Návratová hodnota je římský zápis desetinné číslice odpovídající její číslici.
Procedura toRoman se postará o převod čísla do římského zápisu. Bude analyzovat číslo na desetinná místa. Pro každou desetinnou číslici najde zápis římskými číslicemi v souladu s číslicí, ve které se nachází (k tomu bude zavolána procedura toRomanHelper). Římské zápisy pro desetinné číslice budou zřetězeny dohromady a výsledný řetězec bude vrácen z procedury.
Překlad z římské notace
Opačná konverze bude provedena v opačném pořadí. Řetězec představující římské číslo je třeba nejprve rozdělit na desetinná místa a poté najdeme desetinná místa odpovídající těmto místům.
Úkol kategorizace bude nyní obtížnější. Jde o to, že ne každý řetězec složený z římských číslic bude platným římským zápisem čísla (na rozdíl od desítkového zápisu, ve kterém bude platná jakákoli posloupnost desetinných číslic).
V souladu s pravidly pro tvoření římského zápisu čísel je správný zápis čtyř skupin římských číslic složených dohromady. První (nachází se vlevo) je skupina představující tisíce, pak je skupina stovek, pak desítek a nakonec jednotek. Z čeho se každá z těchto skupin může skládat, je vidět v odpovídajícím sloupci tabulky 31.1. “Psaní desetinných míst římskými číslicemi.”
Dobrým řešením by bylo použití regulárních výrazů k rozdělení římského zápisu do skupin číslic po číslici. Pro každou skupinu je potřeba vytvořit šablonu a uzavřít ji do poutavých závorek. Vzory pro tisíce, stovky, desítky a jedničky dohromady vytvoří regulární výraz, kterému musí odpovídat celá římská notace. Proto byste měli přidat kotvy na začátek a konec řetězce v regulárním výrazu.
Začněme vytvářet šablonu pro číslici jednotek. Řešením, které vás jako první napadne, je uvést všechny alternativy: (|I|II|III|IV|V|VI|VII|VIII|IX) . Všimněte si prázdné alternativy, kterou výčet začíná: skupina jednotek v římské notaci může být prázdná. Toto rozhodnutí lze trochu usnadnit pomocí kvantifikátorů. Pro čísla od 0 do 3 můžete psát I místo |I|II|III, pro čísla od 5 do 8 můžete psát VI místo V|VI|VII|VIII. Pro jedničky tedy dostaneme vzor (I|IV|VI|IX) . Lze to dále zjednodušit kombinací první alternativy se třetí a druhé se čtvrtou: (V?I|I[VX]) .
Pro desítky a stovky jsou získány přesně stejné vzory, pouze složené z jiných římských číslic: (L?X|X[LC]) (desítky) a (D?C|C[DM]) (stovky). Pro tisíce míst je vzorec docela jednoduchý: (M) .
Takže pro celý římský zápis dostaneme následující regulární výraz: ^(M)(D?C|C[DM])(L?X|X[LC])(V?I|I[VX])$ .
| Kapitola 31. Zápis římskými číslicemi | Vývoj |