Dieser Artikel untersucht zwei Python-Methoden zur Umwandlung von Integern in römische Zahlen. Wir werden einen einfachen iterativen Ansatz und eine effizientere Methode unter Verwendung der ganzzahligen Division untersuchen.
Inhaltsverzeichnis
- Iterativer Ansatz zur Integer-zu-Römisch-Umwandlung
- Effiziente Umwandlung mittels ganzzahliger Division
Iterativer Ansatz zur Integer-zu-Römisch-Umwandlung
Diese Methode verwendet ein Dictionary, das römische Ziffern ihren ganzzahligen Werten zuordnet, und iteriert darüber, um die römische Zifferndarstellung zu erstellen. Subtraktive Notation (wie IV für 4) wird explizit behandelt.
def int_to_roman_iterative(num):
"""Wandelt eine ganze Zahl in ihre römische Zifferndarstellung unter Verwendung von Iteration um.
Args:
num: Die umzuwandelnde ganze Zahl (muss zwischen 1 und 3999 inklusive liegen).
Returns:
Die römische Zifferndarstellung der ganzen Zahl oder None, wenn die Eingabe ungültig ist.
"""
if not 1 <= num = value:
result += symbol
num -= value
return result
# Beispiel Verwendung
print(int_to_roman_iterative(3)) # Ausgabe: III
print(int_to_roman_iterative(4)) # Ausgabe: IV
print(int_to_roman_iterative(9)) # Ausgabe: IX
print(int_to_roman_iterative(58)) # Ausgabe: LVIII
print(int_to_roman_iterative(1994)) # Ausgabe: MCMXCIV
print(int_to_roman_iterative(4000)) # Ausgabe: None
Dieser Ansatz ist leicht verständlich, kann aber für größere Zahlen aufgrund der wiederholten Subtraktionen innerhalb der while
-Schleife weniger effizient sein.
Effiziente Umwandlung mittels ganzzahliger Division
Diese Methode verwendet die ganzzahlige Division und den Modulo-Operator, um größere ganze Zahlen effizient zu verarbeiten. Sie iteriert nur einmal durch die Zuordnung römischer Ziffern.
def int_to_roman_division(num):
"""Wandelt eine ganze Zahl in ihre römische Zifferndarstellung unter Verwendung der Division um.
Args:
num: Die umzuwandelnde ganze Zahl (muss zwischen 1 und 3999 inklusive liegen).
Returns:
Die römische Zifferndarstellung der ganzen Zahl oder None, wenn die Eingabe ungültig ist.
"""
if not 1 <= num <= 3999:
return None
roman_map = { 1000: 'M', 900: 'CM', 500: 'D', 400: 'CD', 100: 'C', 90: 'XC',
50: 'L', 40: 'XL', 10: 'X', 9: 'IX', 5: 'V', 4: 'IV', 1: 'I'}
result = ""
for value, symbol in roman_map.items():
result += symbol * (num // value)
num %= value
return result
# Beispiel Verwendung
print(int_to_roman_division(3)) # Ausgabe: III
print(int_to_roman_division(4)) # Ausgabe: IV
print(int_to_roman_division(9)) # Ausgabe: IX
print(int_to_roman_division(58)) # Ausgabe: LVIII
print(int_to_roman_division(1994)) # Ausgabe: MCMXCIV
print(int_to_roman_division(4000)) # Ausgabe: None
Dieser divisionsbasierte Ansatz bietet eine verbesserte Leistung, insbesondere für größere Eingaben, indem redundante Operationen minimiert werden.