Cet article explore deux méthodes Python pour convertir des entiers en chiffres romains. Nous examinerons une approche itérative simple et une méthode plus efficace utilisant la division entière.
Table des matières
Approche itérative de la conversion entier-romain
Cette méthode utilise un dictionnaire mappant les chiffres romains à leurs valeurs entières et les itère pour construire la représentation en chiffres romains. La notation soustractive (comme IV pour 4) est gérée explicitement.
def int_to_roman_iterative(num):
"""Convertit un entier en sa représentation en chiffres romains par itération.
Args:
num: L'entier à convertir (doit être compris entre 1 et 3999 inclus).
Returns:
La représentation en chiffres romains de l'entier, ou None si l'entrée est invalide.
"""
if not 1 <= num = value:
result += symbol
num -= value
return result
# Exemple d'utilisation
print(int_to_roman_iterative(3)) # Sortie: III
print(int_to_roman_iterative(4)) # Sortie: IV
print(int_to_roman_iterative(9)) # Sortie: IX
print(int_to_roman_iterative(58)) # Sortie: LVIII
print(int_to_roman_iterative(1994)) # Sortie: MCMXCIV
print(int_to_roman_iterative(4000)) # Sortie: None
Cette approche est facile à comprendre mais peut être moins efficace pour les grands nombres en raison des soustractions répétées dans la boucle while
.
Conversion efficace utilisant la division entière
Cette méthode utilise la division entière et l’opérateur modulo pour gérer efficacement les grands entiers. Elle itère sur le mappage des chiffres romains une seule fois.
def int_to_roman_division(num):
"""Convertit un entier en sa représentation en chiffres romains en utilisant la division.
Args:
num: L'entier à convertir (doit être compris entre 1 et 3999 inclus).
Returns:
La représentation en chiffres romains de l'entier, ou None si l'entrée est invalide.
"""
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
# Exemple d'utilisation
print(int_to_roman_division(3)) # Sortie: III
print(int_to_roman_division(4)) # Sortie: IV
print(int_to_roman_division(9)) # Sortie: IX
print(int_to_roman_division(58)) # Sortie: LVIII
print(int_to_roman_division(1994)) # Sortie: MCMXCIV
print(int_to_roman_division(4000)) # Sortie: None
Cette approche basée sur la division offre des performances améliorées, en particulier pour les nombres d’entrée plus grands, en minimisant les opérations redondantes.