M1103 – TD2 – Exercice 3

Les nombres romains sont constitués de suites des caractères M, D, C, L, X, V et I, représentant respectivement 1000, 500, 100, 50, 10, 5 et 1. Le calcul de la valeur décimale est très simple lorsque les symboles se présentent dans l’ordre décroissant : il suffit de faire la somme des valeurs des symboles rencontrés. Par exemple, la chaine de caractères MMCVI représente la valeur 2106 (1000 + 1000 + 100 + 5 + 1.

En revanche, lorsque certains symboles sont inversés, il faut les soustraire au symbole suivant. Par exemple, la chaine de caractères CM représente 900 (1000 – 100), et IV représente 4 (5 – 1).

La récursivité offre une élégante solution à ce problème :

  1. si un nombre romain est constitué d’un seul caractère, sa valeur est égale à celle de ce caractère.
  2. la valeur d’un nombre romain est égale à la valeur du premier caractère + la valeur du nombre romain restant, si la valeur de ce premier caractère est supérieure ou égale à celle de son suivant (le deuxième, donc). Par exemple :
        MMXI = M + (MXI) = 
                    MXI = M + (XI)
                               XI = X + (I)
                                         I = 1
                                    10 + 1 = 11
                          1000 + 11 = 1011
              1000 + 1011 = 2011
        2011
    
  3. la valeur d’un nombre romain est égale à la valeur du nombre romain restant après le premier caractère – la valeur du premier caractère, si la valeur de ce caractère est inférieure à celle de son suivant, Par exemple :
        MCMIX = M + (CMIX) = 
                     CMIX = (MIX) - C
                             MIX  = M + (IX)
                                         IX = (X) - I
                                               10
                                              (10 - 1) = 9
                                    1000 + 9 = 1009
                             1009 - 100 = 909
                1000 + 909 = 1909
        1909
    

On suppose qu’existe la fonction ValChRomain() qui renvoie la valeur numérique correspondant au caractère romain qui lui est passé en paramètre.

Ecrire la fonction ValNbRomain() qui renvoie la valeur numérique correspondant à un nombre romain qui lui est passé en paramètre sous forme d’un string. On supposera qu’une chaîne vide a pour valeur 0 et que la chaîne passée en paramètre est valide.