Cet article explore la création d’un convertisseur de nombres romains en C++. Nous allons approfondir le processus de conversion, en nous concentrant sur la transformation des nombres décimaux en leurs équivalents romains. Une compréhension claire de la logique sous-jacente est cruciale pour développer un code efficace et précis.
Table des matières
Conversion décimal en nombres romains
Le système de numération romain utilise des combinaisons de lettres pour représenter les nombres. Chaque lettre a une valeur numérique spécifique :
- I = 1
- V = 5
- X = 10
- L = 50
- C = 100
- D = 500
- M = 1000
La conversion implique d’itérer sur ces valeurs, en ajoutant ou en soustrayant stratégiquement en fonction de la position du nombre et des valeurs adjacentes. Par exemple, IV (4) est V (5) – I (1), et IX (9) est X (10) – I (1). Ce principe soustractif est la clé d’une représentation efficace.
Implémentation C++
La fonction C++ suivante convertit efficacement les nombres décimaux en nombres romains :
#include <iostream>
#include <map>
#include <string>
std::string decimalToRoman(int num) {
if (num <= 0 || num > 3999) return "Entrée invalide";
std::map<int, std::string> romanMap = {
{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"}
};
std::string result = "";
for (auto const& [value, symbol] : romanMap) {
while (num >= value) {
result += symbol;
num -= value;
}
}
return result;
}
int main() {
int decimalNum;
std::cout << "Entrez un nombre décimal (1-3999) : ";
std::cin >> decimalNum;
std::string romanNum = decimalToRoman(decimalNum);
std::cout << "L'équivalent en chiffres romains est : " << romanNum << std::endl;
return 0;
}
Ce code utilise une map pour une recherche efficace des symboles et une boucle while pour gérer les nombres répétés. Les cas soustractifs (comme 4 et 9) sont explicitement définis dans la map pour des performances optimales.
Gestion des erreurs et efficacité
Le code fourni inclut une gestion basique des erreurs pour les entrées en dehors de la plage de 1 à 3999. Pour une solution plus robuste, des vérifications supplémentaires pourraient être ajoutées. L’utilisation d’une map améliore considérablement l’efficacité en fournissant un temps de recherche O(1) pour les symboles romains. L’approche itérative évite les calculs inutiles.
Conclusion
Cet article a présenté une méthode claire et efficace pour convertir les nombres décimaux en nombres romains en C++. L’utilisation d’une map améliore à la fois la lisibilité et les performances. Cette approche est facilement adaptable pour gérer des nombres plus grands ou s’intégrer à des applications plus complexes. N’oubliez jamais une gestion minutieuse des erreurs pour une solution prête pour la production.