Wenn die Bedingung in elif quasi das Gegenteil der if-Bedingung ist, benutzt man else. Statt das Ergebnis einer Division wieder in eine Ganzzahl umzuwandeln, benutzt man Ganzzahldivision:
Code: Alles auswählen
if latin_number >= 1000:
m = latin_number // 1000
else:
m = 0
if (latin_number - m * 1000) >= 500:
d = (latin_number - m * 1000) // 500
else:
d = 0
if (latin_number - m * 1000 - d * 500) >= 100:
c = (latin_number - m * 1000 - d * 500) // 100
else:
c = 0
if (latin_number - m * 1000 - d * 500 - c * 100) >= 50:
l = (latin_number - m * 1000 - d * 500 - c * 100) // 50
else:
l = 0
if (latin_number - m * 1000 - d * 500 - c * 100 - l * 50) >= 10:
x = (latin_number - m * 1000 - d * 500 - c * 100 - l * 50) // 10
else:
x = 0
if (latin_number - m * 1000 - d * 500 - c * 100 - l * 50 - x * 10) >= 5:
v = (latin_number - m * 1000 - d * 500 - c * 100 - l * 50 - x * 10) // 5
else:
v = 0
if (latin_number - m * 1000 - d * 500 - c * 100 - l * 50 - x * 10 - v * 5) >= 1:
i = (latin_number - m * 1000 - d * 500 - c * 100 - l * 50 - x * 10 - v * 5) // 1
else:
i = 0
print(m * "M", d * "D", c * "C", l * "L", x * "X", v * "V", i * "I")
Nun ist aber wenn eine kleinere Zahl durch eine größere Zahl ganzzahldividiert wird, das Ergebnis 0, so dass alle if-Abfragen überflüssig sind:
Code: Alles auswählen
m = latin_number // 1000
d = (latin_number - m * 1000) // 500
c = (latin_number - m * 1000 - d * 500) // 100
l = (latin_number - m * 1000 - d * 500 - c * 100) // 50
x = (latin_number - m * 1000 - d * 500 - c * 100 - l * 50) // 10
v = (latin_number - m * 1000 - d * 500 - c * 100 - l * 50 - x * 10) // 5
i = (latin_number - m * 1000 - d * 500 - c * 100 - l * 50 - x * 10 - v * 5) // 1
print(m * "M", d * "D", c * "C", l * "L", x * "X", v * "V", i * "I")
Statt mehrfach so langen Berechnungen anzustellen, speichere doch das Ergebnis in einer Variable:
Code: Alles auswählen
m = latin_number // 1000
latin_number -= m * 1000
d = latin_number // 500
latin_number -= d * 500
c = latin_number // 100
latin_number -= c * 100
l = latin_number // 50
latin_number -= l * 50
x = latin_number // 10
latin_number -= x * 10
v = latin_number // 5
latin_number -= v * 5
i = latin_number
print(m * "M", d * "D", c * "C", l * "L", x * "X", v * "V", i * "I")
Das ist aber nichts anders als Division mit Rest, dafür gibt es divmod:
Code: Alles auswählen
m, latin_number = divmod(latin_number, 1000)
d, latin_number = divmod(latin_number, 500)
c, latin_number = divmod(latin_number, 100)
l, latin_number = divmod(latin_number, 50)
x, latin_number = divmod(latin_number, 10)
v, i = divmod(latin_number, 5)
print(m * "M", d * "D", c * "C", l * "L", x * "X", v * "V", i * "I")
Wenn man so einen regelmäßigen Code hat, dann möchte man das mit einer Schleife ausdrücken:
Code: Alles auswählen
result = []
for character, value in [("M", 1000), ("D", 500), ("C", 100), ("L", 50), ("X", 10), ("V", 5), ("I", 1)]:
v, latin_number = divmod(latin_number, value)
result.append(v * character)
print(*result)
Zum Schluß geht es darum, das Ergebnis in einen String umzuwandeln, und dafür gibt es str.join:
Code: Alles auswählen
def transform(latin_number):
result = []
for character, value in [("M", 1000), ("D", 500), ("C", 100), ("L", 50), ("X", 10), ("V", 5), ("I", 1)]:
v, latin_number = divmod(latin_number, value)
result.append(v * character)
return "".join(result)
Am Algorithmus fehlt der Sonderfall: CCCC -> CD, LXXXX -> XC, etc.