Kapitola 31. Římské číslice: Nápady na implementaci

Ří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.

READ
Ageratum: fotografie, pěstování ze semen doma

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) .

READ
Záhadné polyfenoly aneb proč jablka tmavnou

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
Rating
( No ratings yet )
Like this post? Please share to your friends:
Leave a Reply

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: