47 lines
1.2 KiB
Plaintext
47 lines
1.2 KiB
Plaintext
MODULE RomanNumeralsEncode;
|
|
|
|
FROM Strings IMPORT
|
|
Append;
|
|
FROM STextIO IMPORT
|
|
WriteString, WriteLn;
|
|
|
|
CONST
|
|
MaxChars = 15;
|
|
(* 3888 or MMMDCCCLXXXVIII (15 chars) is the longest string properly encoded
|
|
with these symbols. *)
|
|
|
|
TYPE
|
|
TRomanNumeral = ARRAY [0 .. MaxChars - 1] OF CHAR;
|
|
|
|
PROCEDURE ToRoman(AValue: CARDINAL; VAR OUT Destination: ARRAY OF CHAR);
|
|
TYPE
|
|
TRomanSymbols = ARRAY [0 .. 1] OF CHAR;
|
|
TWeights = ARRAY [0 .. 12] OF CARDINAL;
|
|
TSymbols = ARRAY [0 .. 12] OF TRomanSymbols;
|
|
CONST
|
|
Weights = TWeights {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
|
|
Symbols = TSymbols {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX",
|
|
"V", "IV", "I"};
|
|
VAR
|
|
I: CARDINAL;
|
|
BEGIN
|
|
Destination := "";
|
|
I := 0;
|
|
WHILE (I <= HIGH(Weights)) AND (AValue > 0) DO
|
|
WHILE AValue >= Weights[I] DO
|
|
Append(Symbols[I], Destination);
|
|
AValue := AValue - Weights[I]
|
|
END;
|
|
INC(I);
|
|
END;
|
|
END ToRoman;
|
|
|
|
VAR
|
|
Numeral: TRomanNumeral;
|
|
|
|
BEGIN
|
|
ToRoman(1990, Numeral); WriteString(Numeral); WriteLn; (* MCMXC *)
|
|
ToRoman(2018, Numeral); WriteString(Numeral); WriteLn; (* MMXVIII *)
|
|
ToRoman(3888, Numeral); WriteString(Numeral); WriteLn; (* MMMDCCCLXXXVIII *)
|
|
END RomanNumeralsEncode.
|