Les chiffres romains, bien qu'ils soient aujourd'hui beaucoup moins pratiques que notre système de numération décimale moderne, demeurent encore largement utilisés dans de nombreux domaines. On les retrouve notamment pour numéroter les chapitres d'ouvrages, les annexes de documents officiels, les pages préliminaires de certains livres, les tomes d'encyclopédies, les suites de films, les règnes de souverains ainsi que diverses inscriptions commémoratives. Hérité de l'Antiquité romaine, ce système de numération repose sur l'utilisation de lettres de l'alphabet latin pour représenter des valeurs numériques précises.
Contrairement au système décimal moderne, qui repose sur une notation positionnelle utilisant les chiffres de 0 à 9, les chiffres romains combinent des symboles tels que I, V, X, L, C, D et M afin de former les nombres désirés. Bien qu'élégante sur le plan historique et visuel, cette méthode présente plusieurs limitations. Les opérations mathématiques y sont beaucoup plus difficiles à réaliser et la représentation des grands nombres devient rapidement encombrante. C'est pourquoi ce système est aujourd'hui principalement conservé pour des usages décoratifs, historiques ou protocolaires.
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 |
| ... | ... | ... | ... |
Malgré ces limitations, il peut être intéressant de convertir automatiquement des nombres décimaux en chiffres romains dans un programme informatique. Une telle fonctionnalité peut être utile lors de la génération de documents, de rapports, de tables des matières ou encore d'applications éducatives portant sur l'histoire ou les mathématiques. Pour y parvenir, il suffit de décomposer le nombre en centaines, dizaines et unités, puis d'associer chacune de ces positions à sa représentation romaine correspondante.
Le programme C++ présenté ci-dessous illustre parfaitement cette technique. À partir d'un nombre entier exprimé en notation décimale, il construit progressivement son équivalent en chiffres romains en appliquant les règles traditionnelles de numération. Les exemples générés montrent la conversion automatique des nombres de 1 à 100, permettant ainsi de vérifier facilement le fonctionnement de l'algorithme et de mieux comprendre la structure de ce système de numération vieux de plus de deux millénaires :
- #include <iostream>
- #include <string.h>
-
- char ReturnString[255];
-
- char * NumberToRomain(int X) {
- strcpy(ReturnString,"");
- switch((X % 1000) / 100) {
- case 9: strcat(ReturnString,"CM");break;
- case 8: strcat(ReturnString,"DCCC");break;
- case 7: strcat(ReturnString,"DCC");break;
- case 6: strcat(ReturnString,"DC");break;
- case 5: strcat(ReturnString,"D");break;
- case 4: strcat(ReturnString,"CD");break;
- case 3: strcat(ReturnString,"CCC");break;
- case 2: strcat(ReturnString,"CC");break;
- case 1: strcat(ReturnString,"C");break;
- }
- switch((X % 100) / 10) {
- case 9: strcat(ReturnString,"XC");break;
- case 8: strcat(ReturnString,"LXXX");break;
- case 7: strcat(ReturnString,"LXX");break;
- case 6: strcat(ReturnString,"LX");break;
- case 5: strcat(ReturnString,"L");break;
- case 4: strcat(ReturnString,"XL");break;
- case 3: strcat(ReturnString,"XXX");break;
- case 2: strcat(ReturnString,"XX");break;
- case 1: strcat(ReturnString,"X");break;
- }
- switch(X % 10) {
- case 9: strcat(ReturnString,"IX");break;
- case 8: strcat(ReturnString,"VIII");break;
- case 7: strcat(ReturnString,"VII");break;
- case 6: strcat(ReturnString,"VI");break;
- case 5: strcat(ReturnString,"V");break;
- case 4: strcat(ReturnString,"IV");break;
- case 3: strcat(ReturnString,"III");break;
- case 2: strcat(ReturnString,"II");break;
- case 1: strcat(ReturnString,"I");break;
- }
- return ReturnString;
- }
-
- int main()
- {
- for(int I=1;I<=100;I++) {
- std::cout << I << " = " << NumberToRomain(I) << std::endl;
- }
- return 0;
- }
on obtiendra le résultat suivant :
1 = I2 = 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