Étant donné une chaîne sous forme romaine, la tâche consiste à convertir cette chaîne romaine donnée en un entier.
chiffres romains sont basés sur les symboles suivants :
Symbole | Valeur |
|---|---|
je algorithme pour bfs | 1 |
DANS | 5 |
X ajouter la gestion des exceptions Java | dix |
L industrie et usine | cinquante |
C | 100 |
D | 500 |
M | 1000 |
Exemple:
Pratique recommandée Nombre romain en nombre entier Essayez-le !Saisir: IX
Sortir: 9
Explication: IX est un symbole romain qui représente 9sélecteur de requêteSaisir: XL
Sortir: 40
Explication: XL est un symbole romain qui représente 40caractère en entier javaSaisir: MCMIV
Sortir: 1904
Explication: M vaut mille, CM vaut neuf cents et IV vaut quatre
Approche: Un nombre en chiffres romains est une chaîne de ces symboles écrits par ordre décroissant (par exemple, le M en premier, suivi du D, etc.). Cependant, dans quelques cas particuliers, pour éviter la répétition successive de quatre caractères(comme IIII ou XXXX), notation soustractive est souvent utilisé comme suit :
- je placé avant DANS ou X indique un de moins, donc quatre est IV (un de moins de 5) et 9 est IX (un de moins de 10).
- X placé avant L ou C indique dix de moins, donc quarante est XL (10 de moins de 50) et 90 est XC (dix moins de cent).
- C placé avant D ou M indique cent de moins, donc quatre cents c'est CD (cent moins de cinq cents) et neuf cents est CM (une centaine moins de mille).
Algorithme pour convertir des chiffres romains en nombres entiers :
- Divisez la chaîne de chiffres romains en symboles romains (caractère).
- Convertissez chaque symbole de chiffres romains en la valeur qu'il représente.
- Prenez les symboles un par un à partir de l'index 0 :
- Si la valeur actuelle du symbole est supérieure ou égale à la valeur du symbole suivant, ajoutez cette valeur au total cumulé.
- sinon, soustrayez cette valeur en ajoutant la valeur du symbole suivant au total cumulé.
Voici l’implémentation de l’algorithme ci-dessus :
C++ // Program to convert Roman // Numerals to Numbers #include using namespace std; // This function returns value // of a Roman symbol int value(char r) { if (r == 'I') return 1; if (r == 'V') return 5; if (r == 'X') return 10; if (r == 'L') return 50; if (r == 'C') return 100; if (r == 'D') return 500; if (r == 'M') return 1000; return -1; } // Returns decimal value of // roman numaral int romanToDecimal(string& str) { // Initialize result int res = 0; // Traverse given input for (int i = 0; i < str.length(); i++) { // Getting value of symbol s[i] int s1 = value(str[i]); if (i + 1 < str.length()) { // Getting value of symbol s[i+1] int s2 = value(str[i + 1]); // Comparing both values if (s1>= s2) { // La valeur du symbole actuel // est supérieure ou égale // au symbole suivant res = res + s1; } else { // La valeur du symbole actuel est // inférieure au symbole suivant res = res + s2 - s1; je++; } } autre { res = res + s1; } } renvoie res; } // Driver Code int main() { // Considérant que les entrées données sont valides string str = 'MCMIV'; cout<< 'Integer form of Roman Numeral is ' << romanToDecimal(str) << endl; return 0; }> C // Program to convert Roman // Numerals to Numbers #include #include // This function returns value // of a Roman symbol int value(char r) { if (r == 'I') return 1; if (r == 'V') return 5; if (r == 'X') return 10; if (r == 'L') return 50; if (r == 'C') return 100; if (r == 'D') return 500; if (r == 'M') return 1000; return -1; } // Returns decimal value of // roman numaral int romanToDecimal(char str[]) { // Initialize result int res = 0; // Traverse given input for (int i = 0; i < strlen(str); i++) { // Getting value of symbol s[i] int s1 = value(str[i]); if (i + 1 < strlen(str)) { // Getting value of symbol s[i+1] int s2 = value(str[i + 1]); // Comparing both values if (s1>= s2) { // La valeur du symbole actuel // est supérieure ou égale // au symbole suivant res = res + s1; } else { // La valeur du symbole actuel est // inférieure au symbole suivant res = res + s2 - s1; je++; } } autre { res = res + s1; } } renvoie res; } // Driver Code int main() { // Considérant que les entrées données sont valides char str[10] = 'MCMIV'; printf('La forme entière du chiffre romain est %d',romanToDecimal(str)); renvoie 0 ; }> Java // Program to convert Roman // Numerals to Numbers import java.util.*; public class RomanToNumber { // This function returns // value of a Roman symbol int value(char r) { if (r == 'I') return 1; if (r == 'V') return 5; if (r == 'X') return 10; if (r == 'L') return 50; if (r == 'C') return 100; if (r == 'D') return 500; if (r == 'M') return 1000; return -1; } // Finds decimal value of a // given roman numeral int romanToDecimal(String str) { // Initialize result int res = 0; for (int i = 0; i < str.length(); i++) { // Getting value of symbol s[i] int s1 = value(str.charAt(i)); // Getting value of symbol s[i+1] if (i + 1 < str.length()) { int s2 = value(str.charAt(i + 1)); // Comparing both values if (s1>= s2) { // La valeur du symbole actuel // est supérieure ou égale // au symbole suivant res = res + s1; } else { // La valeur du symbole actuel est // inférieure au symbole suivant res = res + s2 - s1; je++; } } autre { res = res + s1; } } renvoie res; } // Code du pilote public static void main(String args[]) { RomanToNumber ob = new RomanToNumber(); // Considérant que les entrées données sont valides String str = 'MCMIV'; System.out.println('Forme entière d'un chiffre romain' + ' est ' + ob.romanToDecimal(str)); } }> Python # Python program to convert Roman Numerals # to Numbers # This function returns value of each Roman symbol def value(r): if (r == 'I'): return 1 if (r == 'V'): return 5 if (r == 'X'): return 10 if (r == 'L'): return 50 if (r == 'C'): return 100 if (r == 'D'): return 500 if (r == 'M'): return 1000 return -1 def romanToDecimal(str): res = 0 i = 0 while (i < len(str)): # Getting value of symbol s[i] s1 = value(str[i]) if (i + 1 < len(str)): # Getting value of symbol s[i + 1] s2 = value(str[i + 1]) # Comparing both values if (s1>= s2) : # La valeur du symbole actuel est supérieure # ou égale au symbole suivant res = res + s1 i = i + 1 sinon : # La valeur du symbole actuel est supérieure # ou égale au symbole suivant res = res + s2 - s1 i = i + 2 sinon : res = res + s1 i = i + 1 return res # Code du pilote print('La forme entière du chiffre romain est'), print(romanToDecimal('MCMIV'))>'>C#= s2) { // La valeur du symbole actuel est supérieure // ou égale au symbole suivant res = res + s1; } autre { res = res + s2 - s1; je++; // La valeur du symbole actuel est // inférieure au symbole suivant } } else { res = res + s1; je++; } } renvoie res; } // Code du pilote public static void Main(string[] args) { GFG ob = new GFG(); // Considérant que les entrées données sont valides string str = 'MCMIV'; Console.WriteLine('Forme entière d'un chiffre romain' + ' est ' + ob.romanToDecimal(str)); } } // Ce code est contribué par Shrikant13> Javascript >
PHP // Program to convert Roman // Numerals to Numbers // This function returns // value of a Roman symbol function value($r) { if ($r == 'I') return 1; if ($r == 'V') return 5; if ($r == 'X') return 10; if ($r == 'L') return 50; if ($r == 'C') return 100; if ($r == 'D') return 500; if ($r == 'M') return 1000; return -1; } // Returns decimal value // of roman numeral function romanToDecimal(&$str) { // Initialize result $res = 0; // Traverse given input for ($i = 0; $i < strlen($str); $i++) { // Getting value of // symbol s[i] $s1 = value($str[$i]); if ($i+1 < strlen($str)) { // Getting value of // symbol s[i+1] $s2 = value($str[$i + 1]); // Comparing both values if ($s1>= $s2) { // La valeur du symbole actuel // est supérieure ou égale // au symbole suivant $res = $res + $s1; } autre { $res = $res + $s2 - $s1; $i++; // La valeur du symbole actuel est // inférieure au symbole suivant } } else { $res = $res + $s1; $i++; } } renvoie $res ; } // Code du pilote // Considérant que les entrées // données sont valides $str ='MCMIV'; echo 'La forme entière du chiffre romain est ', romanToDecimal($str), '
'; // Ce code est contribué par ajit ?>> Sortir
Integer form of Roman Numeral is 1904>
Analyse de complexité :
- Complexité temporelle : O(n), où n est la longueur de la chaîne.
Un seul parcours de la chaîne est requis. - Espace auxiliaire : O(1), car aucun espace supplémentaire n'est requis.