Python Programming

Conversion efficace entier vers chiffres romains en Python

Spread the love

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

  1. Approche itérative de la conversion entier-romain
  2. Conversion efficace utilisant la division entière

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *