Section courante

A propos

Section administrative du site

Les chiffres romains constituent l'un des plus anciens systèmes de numération encore connus et utilisés de nos jours. Hérités de la civilisation romaine, ils ont traversé les siècles et continuent d'apparaître dans de nombreux contextes malgré l'adoption quasi universelle du système décimal moderne. Bien que leur utilisation soit beaucoup moins pratique pour effectuer des calculs arithmétiques complexes, ils demeurent particulièrement appréciés pour leur aspect traditionnel, historique et esthétique. On les retrouve fréquemment dans la numérotation des chapitres, des annexes, des préfaces et des introductions d'ouvrages, mais également dans les noms de souverains, de papes, de manifestations officielles ou encore dans les titres de films et de séries comportant plusieurs épisodes. Ainsi, des notations comme «Louis XIV», «Jean-Paul II» ou encore «Rocky IV» demeurent immédiatement reconnaissables pour la plupart des lecteurs.

Contrairement aux systèmes de numération positionnels modernes comme les bases décimale, octale ou hexadécimale, les chiffres romains reposent sur un ensemble limité de symboles tels que I, V, X, L, C, D et M. Chaque symbole possède une valeur fixe et les nombres sont construits à l'aide de règles d'addition et de soustraction particulières. Le tableau ci-dessous présente quelques équivalences entre les représentations romaines, décimales, octales et hexadécimales afin d'illustrer les différences entre ces systèmes de numération. Cette comparaison permet de constater qu'un même nombre peut être représenté de multiples façons selon le système choisi, tout en conservant exactement la même valeur numérique.

Toutefois, il convient de souligner que la numérotation romaine possède plusieurs limites. Elle devient rapidement peu pratique pour représenter de très grandes quantités et ne dispose pas naturellement des mécanismes de calcul efficaces présents dans les systèmes numériques modernes. Malgré cela, il peut être utile, dans certaines applications informatiques, de générer automatiquement des nombres romains à partir de leur équivalent décimal. Cette fonctionnalité est notamment employée dans les logiciels de traitement de texte, les outils de publication, les systèmes de génération de documents ou encore certaines applications éducatives consacrées à l'histoire et aux mathématiques.

Le programme en langage C présenté ci-dessous montre comment effectuer cette conversion de manière automatique. À partir d'une valeur entière, la fonction NumberToRomain construit progressivement la représentation romaine correspondante en analysant séparément les centaines, les dizaines et les unités. Les différentes combinaisons possibles sont ensuite assemblées afin de produire le résultat final. L'exemple fourni génère les équivalents romains des nombres de 1 à 100 et permet de vérifier facilement l'exactitude de l'algorithme. Cet exemple illustre parfaitement comment des techniques de manipulation de chaînes de caractères peuvent être utilisées pour reproduire un système de numération vieux de plus de deux mille ans au sein d'un programme informatique moderne.

Voici leur représentation classique :

Nombre Romain Nombre décimal Nombre octal Nombre hexadécimal
I 1 1 1
II 2 2 2
III 3 3 3
IV 4 4 4
V 5 5 5
VI 6 6 6
VII 7 7 7
VIII 8 10 8
IX 9 11 9
X 10 12 A
XI 11 13 B
XII 12 14 C
XIII 13 15 D
XIV 14 16 E
XV 15 17 F
... ... ... ...

Toutefois, il est a noter que les chiffres romain ne dépasse que de très peu les milliers en terme de numérotation. Pour pouvoir générer automatiquement les nombres à partir de l'équivalence numérique, vous trouverez la réponse que vous souhaitez, à l'aide du code source C suivant :

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. char ReturnString[255];
  6.  
  7. char * NumberToRomain(int X) {
  8.   strcpy(ReturnString,"");
  9.   switch((X % 1000) / 100) {
  10.    case 9: strcat(ReturnString,"CM");break;
  11.    case 8: strcat(ReturnString,"DCCC");break;
  12.    case 7: strcat(ReturnString,"DCC");break;
  13.    case 6: strcat(ReturnString,"DC");break;
  14.    case 5: strcat(ReturnString,"D");break;
  15.    case 4: strcat(ReturnString,"CD");break;
  16.    case 3: strcat(ReturnString,"CCC");break;
  17.    case 2: strcat(ReturnString,"CC");break;
  18.    case 1: strcat(ReturnString,"C");break;
  19.   }
  20.   switch((X % 100) / 10) {
  21.    case 9: strcat(ReturnString,"XC");break;
  22.    case 8: strcat(ReturnString,"LXXX");break;
  23.    case 7: strcat(ReturnString,"LXX");break;
  24.    case 6: strcat(ReturnString,"LX");break;
  25.    case 5: strcat(ReturnString,"L");break;
  26.    case 4: strcat(ReturnString,"XL");break;
  27.    case 3: strcat(ReturnString,"XXX");break;
  28.    case 2: strcat(ReturnString,"XX");break;
  29.    case 1: strcat(ReturnString,"X");break;
  30.   }
  31.   switch(X % 10) {
  32.    case 9: strcat(ReturnString,"IX");break;
  33.    case 8: strcat(ReturnString,"VIII");break;
  34.    case 7: strcat(ReturnString,"VII");break;
  35.    case 6: strcat(ReturnString,"VI");break;
  36.    case 5: strcat(ReturnString,"V");break;
  37.    case 4: strcat(ReturnString,"IV");break;
  38.    case 3: strcat(ReturnString,"III");break;
  39.    case 2: strcat(ReturnString,"II");break;
  40.    case 1: strcat(ReturnString,"I");break;
  41.   }
  42.   return ReturnString;
  43. }
  44.  
  45. int main()
  46. {
  47.     int I;
  48.     for(I=1;I<=100;I++) {
  49.           printf("%i = %sn",I,NumberToRomain(I));
  50.      }
  51.     return 0;
  52. }

on obtiendra le résultat suivant :

1 = I
2 = II
3 = III
4 = IV
5 = V
6 = VI
7 = VII
8 = VIII
9 = IX
10 = X
11 = XI
12 = XII
13 = XIII
14 = XIV
15 = XV
16 = XVI
17 = XVII
18 = XVIII
19 = XIX
20 = XX
21 = XXI
22 = XXII
23 = XXIII
24 = XXIV
25 = XXV
26 = XXVI
27 = XXVII
28 = XXVIII
29 = XXIX
30 = XXX
31 = XXXI
32 = XXXII
33 = XXXIII
34 = XXXIV
35 = XXXV
36 = XXXVI
37 = XXXVII
38 = XXXVIII
39 = XXXIX
40 = XL
41 = XLI
42 = XLII
43 = XLIII
44 = XLIV
45 = XLV
46 = XLVI
47 = XLVII
48 = XLVIII
49 = XLIX
50 = L
51 = LI
52 = LII
53 = LIII
54 = LIV
55 = LV
56 = LVI
57 = LVII
58 = LVIII
59 = LIX
60 = LX
61 = LXI
62 = LXII
63 = LXIII
64 = LXIV
65 = LXV
66 = LXVI
67 = LXVII
68 = LXVIII
69 = LXIX
70 = LXX
71 = LXXI
72 = LXXII
73 = LXXIII
74 = LXXIV
75 = LXXV
76 = LXXVI
77 = LXXVII
78 = LXXVIII
79 = LXXIX
80 = LXXX
81 = LXXXI
82 = LXXXII
83 = LXXXIII
84 = LXXXIV
85 = LXXXV
86 = LXXXVI
87 = LXXXVII
88 = LXXXVIII
89 = LXXXIX
90 = XC
91 = XCI
92 = XCII
93 = XCIII
94 = XCIV
95 = XCV
96 = XCVI
97 = XCVII
98 = XCVIII
99 = XCIX
100 = C


Dernière mise à jour : Samedi, le 22 août 2015