logo

Conversie romană la întreg

Încercați -l în practica GFG ' title=

Având în vedere un șir care reprezintă un număr roman, consideră că este o valoare integrală corespunzătoare.
Numerele romane sunt formate folosind următoarele simboluri: i = 1 v = 5 x = 10 l = 50 c = 100 d = 500 și m = 1000.
Numerele sunt de obicei formate prin combinarea acestor simboluri de la stânga la dreapta, adăugând sau scăzând valorile lor pe baza regulilor specifice.

ouă de Paște în Android

Cum funcționează conversia?

  • Dacă un simbol cu ​​valoare mai mică vine înainte de a scădea. Altfel adăugăm.
  • În IV I vine înainte ca V și V să aibă o valoare mai mare 5. Deci rezultatul nostru este 5 - 1 = 4.
  • În VI V vine înainte ca eu și eu să am o valoare mai mică 1. Deci rezultatul nostru este 5 + 1 = 6.
  • În II avem aceleași valori, așa că adăugăm și obținem 1 + 1 = 2
  • În caz de mai mult de 2 caractere, traversăm de la stânga la dreapta și de grup doar atunci când vedem un caracter cu valoare mai mare după un caracter cu valoare mai mică. De exemplu, MXVII este 1000 + 10 + 5 + 1 + 1 = 1017. Și XLVII este (50 - 10) + 5 + 1 + 1 = 47. Rețineți că L este mai mare și vine după X.

Exemple:



Intrare: s = 'ix'
Ieșire: 9
Explicaţie: IX este un simbol roman care reprezintă 10 - 1 = 9

Intrare: s = 'xl'
Ieșire: 40
Explicaţie: XL este un simbol roman care reprezintă 50 - 10 = 40

introduceți gestionarea excepțiilor java

Intrare: s = 'McMiv'
Ieșire: 1904
Explicaţie: M este de 1000 cm este 1000 - 100 = 900 și IV este 4. Deci avem în total 1000 + 900 + 4 = 1904

Tabel de conținut

[Abordarea așteptată 1] folosind comparație iterativă - O (N) Timp și O (1) Spațiu

Ideea de a converti un număr roman într -un număr întreg este că trebuie să traversăm șirul de la stânga la dreapta. Pentru fiecare simbol comparați -l cu următorul simbol (dacă există). Dacă simbolul curent este mai mare sau egal cu următorul simbol, adăugați valoarea acestuia la rezultat. În caz contrar, scădeți valoarea sa din valoarea următorului simbol și adăugați rezultatul la total și săriți următorul simbol.

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)); 

Ieșire
9 

[Abordarea așteptată 2] folosind hashing - O (N) Timp și O (1) Spațiu

Putem folosi o hartă sau un dicționar pentru a stoca valorile simbolurilor romane. Și pentru a rezolva problema pe care trebuie să o iterăm prin șir și pentru fiecare simbol verificați dacă valoarea curentă este mai mică decât următoarea valoare. Dacă da, scădeți valoarea curentă de la următoarea valoare și adăugați rezultatul la total. În caz contrar, adăugați valoarea curentă la total.

filme123 la
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)); 

Ieșire
9