Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Roman To Dec


F34r0fTh3D4rk - Mo 18.09.06 14:40
Titel: Roman To Dec
hi, ich habe eben einen Algorithmus zum Umwandeln von Römischen Zahlen in Dezimalzahlen geschrieben, was kann ich da noch dran optimieren ?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
function RomanToDec(iRoman: string): integer;
const
  aRomans: array [1..7of string = ('I''V''X''L''C''D''M');
  aArabics: array [1..7of integer = (1510501005001000);
var
  i, j, k, l: integer;
  addition: boolean;
begin
//Bei einer Länge von 1
  if length(iRoman) = 1 then
  for i := 7 downto 1 do
    if aRomans[i] = iRoman[1then
    begin
      result := aArabics[i];
      exit;
    end;
//
  result := 0;
//Schleife, beginnend bei Stringende bis 2
  i := length(iRoman);
  while i > 1 do
  begin
    //Wert an der Stelle i ermitteln
    for j := 1 to 7 do
      if (aRomans[j] = iRoman[i]) then
      begin
        addition := false;
        //Prüfen ob ein kleinerer Wert vorrausgeht
        for k := 1 to 7 do
          if (aRomans[k] = iRoman[i-1]) then
            if (aArabics[k] < aArabics[j]) then
            begin
              //Berechnung
              result := result + (aArabics[j] - aArabics[k]);
              addition := true;
              dec(i);
            end;
        //Berechnung, falls kein kleinerer Wert vorangegangen ist
        if addition = false then
          result := result + aArabics[j];
        //Berechnung der ersten Stelle  
        if (i = 2then
          for l := 7 downto 1 do
            if aRomans[l] = iRoman[1then
              result := result + aArabics[l];
      end;
    dec(i);
  end;
end;


mfg


delfiphan - Mo 18.09.06 15:28

So wie es aussieht geht's auch ohne 3-fache Schleife. Einige andere Sources zum Vergleich:
http://www.koders.com/?s=roman+number&_%3Abtn=Search&_%3Ala=*&_%3Ali=*