So, jetzt auch noch eine Variante von mir, um Dezimalzahlen in Römische umzuwandeln. Ist nicht ganz so performant, wie obige, aber unterstützt zwei zugelassene Systeme
Die Variante von
Daniel B wandelt 99 in
XCIX um. Das ist die verbreitetere Variante. Die für Schulen zugelassenen Tafelwerke fordern für 99 jedoch
IC. Beide Varianten sind okay. Der Parameter
Default unterscheidet welche Variante zurückgegeben wird.
False gibt Variante 1,
True Variante zwei. (99 diente hier als Beispiel!)
Delphi-Quellcode:
function DecToRoman(Decimal: Cardinal;
Default: Boolean): WideString;
type
TRelation =
record
Ch: Char;
Vl: Cardinal;
Check: Boolean;
end;
const
cRoman:
array[0..6]
of TRelation = (
(Ch: '
I'; Vl: 1; Check: True),
(Ch: '
V'; Vl: 5; Check: False),
(Ch: '
X'; Vl: 10; Check: True),
(Ch: '
L'; Vl: 50; Check: False),
(Ch: '
C'; Vl: 100; Check: True),
(Ch: '
D'; Vl: 500; Check: False),
(Ch: '
M'; Vl: 1000; Check: False)
);
var
I, J: Integer;
begin
Result := '
';
for I := High(cRoman)
downto Low(cRoman)
do
begin
while Decimal >= cRoman[I].Vl
do
begin
Result := Result + cRoman[I].Ch;
Dec(Decimal, cRoman[I].Vl);
end;
if Decimal = 0
then
Break;
if Default then
begin
if I > Low(cRoman)
then
for J := Low(cRoman)
to Pred(I)
do
if cRoman[J].Check
then
if cRoman[I].Vl - cRoman[J].Vl <= Decimal
then
begin
Result := Result + cRoman[J].Ch + cRoman[I].Ch;
Dec(Decimal, cRoman[I].Vl - cRoman[J].Vl);
Break;
end;
end else begin
if I > Low(cRoman)
then
begin
J := Pred(I);
if not cRoman[J].Check
then
J := Pred(J);
if cRoman[I].Vl - cRoman[J].Vl <= Decimal
then
begin
Result := Result + cRoman[J].Ch + cRoman[I].Ch;
Dec(Decimal, cRoman[I].Vl - cRoman[J].Vl);
end;
end;
end;
end;
end;
...
...