logo

Conversion romaine en nombre entier

Essayez-le sur GfG Practice ' title=

Étant donné une chaîne s représentant un chiffre romain, trouvez la valeur entière correspondante.
Les chiffres romains sont formés à l'aide des symboles suivants : I = 1 V = 5 X = 10 L = 50 C = 100 D = 500 et M = 1000.
Les nombres sont généralement formés en combinant ces symboles de gauche à droite en ajoutant ou en soustrayant leurs valeurs en fonction de règles spécifiques.

liste des utilisateurs MySQL

Comment se déroule la conversion ?



  • Si un symbole de valeur plus petit apparaît avant la soustraction. Sinon on ajoute.
  • Dans IV, I vient avant V et V a une valeur plus grande, 5. Notre résultat est donc 5 - 1 = 4.
  • Dans VI, V vient avant I et I a une valeur plus petite 1. Notre résultat est donc 5 + 1 = 6.
  • En II, nous avons les mêmes valeurs donc nous additionnons et obtenons 1 + 1 = 2
  • Dans le cas de plus de 2 caractères, nous parcourons de gauche à droite et regroupons uniquement lorsque nous voyons un caractère de valeur supérieure après un caractère de valeur inférieure. Par exemple, MXVII vaut 1000 + 10 + 5 + 1 + 1 = 1017. Et XLVII vaut (50 - 10) + 5 + 1 + 1 = 47. Notez que L est plus grand et vient après X.

Exemples :

Saisir: s = 'IX'
Sortir: 9
Explication: IX est un symbole romain qui représente 10 - 1 = 9

des sites comme coomeet

Saisir: s = 'XL'
Sortir: 40
Explication: XL est un symbole romain qui représente 50 - 10 = 40



Saisir: s = 'MCMIV'
Sortir: 1904
Explication: M vaut 1000 CM vaut 1000 - 100 = 900 et IV vaut 4. Nous avons donc un total de 1000 + 900 + 4 = 1904

Table des matières

intelligence artificielle et agents intelligents

[Approche attendue 1] Utilisation de la comparaison itérative - Temps O(n) et espace O(1)

L’idée pour convertir un chiffre romain en nombre entier est que nous devons parcourir la chaîne de gauche à droite. Pour chaque symbole, comparez-le avec le symbole suivant (s'il existe). Si le symbole actuel est supérieur ou égal au symbole suivant, ajoutez sa valeur au résultat. Sinon, soustrayez sa valeur de la valeur du symbole suivant, ajoutez le résultat au total et ignorez le symbole suivant.



C++
#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 numeral int romanToDecimal(string& s) {  int res = 0;   for (int i = 0; i < s.length(); i++) {    // get value of current symbol  int s1 = value(s[i]);  // Compare with the next symbol if it exists  if (i + 1 < s.length()) {  int s2 = value(s[i + 1]);  // if current value is greater or equal   // add it to result  if (s1 >= s2) {  res += s1;  }  else {  // else add the difference and skip   // next symbol  res += (s2 - s1);  i++;  }  }  else {  res += s1;  }  }  return res; } int main() {  string s = 'IX';  cout << romanToDecimal(s) << endl;  return 0; } 
Java
class GfG {  // this function returns value of a Roman symbol  static 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 numeral  static int romanToDecimal(String s) {  int res = 0;   for (int i = 0; i < s.length(); i++) {    //get value of current symbol  int s1 = value(s.charAt(i));  // compare with the next symbol if it exists  if (i + 1 < s.length()) {  int s2 = value(s.charAt(i + 1));  // If current value is greater or equal   // add it to result  if (s1 >= s2) {  res += s1;  }  else {  // else add the difference and skip   // next symbol  res += (s2 - s1);  i++;  }  }  else {  res += s1;  }  }  return res;  }  public static void main(String[] args) {  String s = 'IX';  System.out.println(romanToDecimal(s));  } } 
Python
# this function returns value of a 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 # returns decimal value of roman numeral def romanToDecimal(s): res = 0 i = 0 while i < len(s): # get value of current symbol s1 = value(s[i]) # compare with the next symbol if it exists if i + 1 < len(s): s2 = value(s[i + 1]) # if current value is greater or equal  # add it to result if s1 >= s2: res += s1 else: # else add the difference and  # skip next symbol res += (s2 - s1) i += 1 else: res += s1 i += 1 return res if __name__ == '__main__': s = 'IX' print(romanToDecimal(s)) 
C#
using System; class GfG {    // this function returns value of a Roman symbol  static 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 numeral  static int romanToDecimal(string s) {  int res = 0;   for (int i = 0; i < s.Length; i++) {    // get value of current symbol  int s1 = value(s[i]);  // compare with the next symbol if it exists  if (i + 1 < s.Length) {  int s2 = value(s[i + 1]);  // if current value is greater or equal   // add it to result  if (s1 >= s2) {  res += s1;  }  else {  // else add the difference and skip  // next symbol  res += (s2 - s1);  i++;  }  }  else {  res += s1;  }  }  return res;  }  static void Main() {  string s = 'IX';  Console.WriteLine(romanToDecimal(s));  } } 
JavaScript
// 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(s) {  let res = 0;   for (let i = 0; i < s.length; i++) {    // get value of current symbol  let s1 = value(s[i]);  // compare with the next symbol if it exists  if (i + 1 < s.length) {  let s2 = value(s[i + 1]);  // if current value is greater or equal   // add it to result  if (s1 >= s2) {  res += s1;  }  else {  // else add the difference and   // skip next symbol  res += (s2 - s1);  i++;  }  }  else {  res += s1;  }  }  return res; } // Driver Code let s = 'IX';  console.log(romanToDecimal(s)); 

Sortir
9 

[Approche attendue 2] Utilisation du hachage - Temps O(n) et espace O(1)

Nous pouvons utiliser une carte de hachage ou un dictionnaire pour stocker les valeurs des symboles romains. Et pour résoudre le problème, nous devons parcourir la chaîne et pour chaque symbole vérifier si la valeur actuelle est inférieure à la valeur suivante. Si tel est le cas, soustrayez la valeur actuelle de la valeur suivante et ajoutez le résultat au total. Sinon, ajoutez la valeur actuelle au total.

C++
#include    #include  using namespace std; int romanToDecimal(string &s) {  unordered_map<char int> romanMap = {{'I' 1}   {'V' 5}   {'X' 10}   {'L' 50}  {'C' 100}   {'D' 500}   {'M' 1000}};  int res = 0;  for (int i = 0; i < s.length(); i++) {  // if the current value is less than the next value   // subtract current from next and add to res  if (i + 1 < s.length() && romanMap[s[i]] < romanMap[s[i + 1]]) {  res += romanMap[s[i + 1]] - romanMap[s[i]];  // skip the next symbol  i++;  }  else {  // otherwise add the current value to res  res += romanMap[s[i]];  }  }  return res; } int main() {  string s = 'IX';  cout << romanToDecimal(s) << endl;  return 0; } 
Java
import java.util.HashMap; class GfG {  static int romanToDecimal(String s) {  HashMap<Character Integer> romanMap = new HashMap<>();  romanMap.put('I' 1);  romanMap.put('V' 5);  romanMap.put('X' 10);  romanMap.put('L' 50);  romanMap.put('C' 100);  romanMap.put('D' 500);  romanMap.put('M' 1000);  int res = 0;  for (int i = 0; i < s.length(); i++) {  // if the current value is less than the next value  // subtract current from next and add to res  if (i + 1 < s.length() && romanMap.get(s.charAt(i)) <   romanMap.get(s.charAt(i + 1))) {  res += romanMap.get(s.charAt(i + 1)) -   romanMap.get(s.charAt(i));  // skip the next symbol  i++;  }  else {  // otherwise add the current value to res  res += romanMap.get(s.charAt(i));  }  }  return res;  }  public static void main(String[] args) {  String s = 'IX';  System.out.println(romanToDecimal(s));  } } 
Python
def romanToDecimal(s): romanMap = {'I': 1 'V': 5 'X': 10 'L': 50 'C': 100 'D': 500 'M': 1000} res = 0 i = 0 while i < len(s): # if the current value is less than the next value  # subtract current from next and add to res if i + 1 < len(s) and romanMap[s[i]] < romanMap[s[i + 1]]: res += romanMap[s[i + 1]] - romanMap[s[i]] # skip the next symbol i += 1 else: # otherwise add the current value to res res += romanMap[s[i]] i += 1 return res if __name__ == '__main__': s = 'IX' print(romanToDecimal(s)) 
C#
using System; using System.Collections.Generic; class GfG {  static int romanToDecimal(string s) {    // create a map to store the Roman numeral values  Dictionary<char int> romanMap =   new Dictionary<char int> {  {'I' 1} {'V' 5} {'X' 10} {'L' 50}  {'C' 100} {'D' 500} {'M' 1000}  };  int res = 0;  for (int i = 0; i < s.Length; i++) {    // if the current value is less than the next value   // subtract current from next and add to res  if (i + 1 < s.Length && romanMap[s[i]] < romanMap[s[i + 1]]) {  res += romanMap[s[i + 1]] - romanMap[s[i]];  // skip the next symbol  i++;  }  else {    // otherwise add the current value to res  res += romanMap[s[i]];  }  }  return res;  }  static void Main() {  string s = 'IX';  Console.WriteLine(romanToDecimal(s));  } } 
JavaScript
function romanToDecimal(s) {    // create a map to store the Roman numeral values  const romanMap = {  'I': 1 'V': 5 'X': 10 'L': 50  'C': 100 'D': 500 'M': 1000  };  let res = 0;  for (let i = 0; i < s.length; i++) {  // if the current value is less than the next value   // subtract current from next and add to res  if (i + 1 < s.length && romanMap[s[i]] < romanMap[s[i + 1]]) {  res += romanMap[s[i + 1]] - romanMap[s[i]];  // skip the next symbol  i++;  }  else {  // otherwise add the current value to res  res += romanMap[s[i]];  }  }  return res; } // Driver Code let s = 'IX'; console.log(romanToDecimal(s)); 

Sortir
9