logo

Conversia numerelor romane în numere întregi

Dat un șir în formă romană, sarcina este de a converti acest șir roman dat într-un număr întreg.

numere romane se bazează pe următoarele simboluri:



Simbol

Valoare

eu



verilog întotdeauna

1

ÎN

5



X

lista de programe python

10

L

tutorial .net

cincizeci

C

100

D

500

M

1000

Exemplu:

Intrare: IX
Ieșire: 9
Explicaţie: IX este un simbol roman care reprezintă 9

mylivecricket.

Intrare: XL
Ieșire: 40
Explicaţie: XL este un simbol roman care reprezintă 40

subșirul java conține

Intrare: MCMIV
Ieșire: 1904
Explicaţie: M este o mie, CM este nouă sute și IV este patru

Practică recomandată Numărul roman la întreg Încercați!

Abordare: Un număr în cifre romane este un șir din aceste simboluri scrise în ordine descrescătoare (de exemplu, primul lui M, urmat de D etc.). Cu toate acestea, în câteva cazuri specifice, pentru a evita repetarea a patru caractere în succesiune (cum ar fi IIII sau XXXX), notatie stractiva este adesea folosit după cum urmează:

  • eu plasat înainte ÎN sau X indică unul mai puțin, deci patru este IV (unul mai mic de 5) și 9 este IX (unul mai puțin de 10).
  • X plasat înainte L sau C indică zece mai puțin, deci patruzeci este XL (10 mai puțin de 50) și 90 este XC (zece mai puțin de o sută).
  • C plasat înainte D sau M indică o sută mai puțin, deci patru sute este CD (o sută mai puțin de cinci sute) și nouă sute este CM (o sută mai puțin decât o mie).

Algoritm pentru conversia numerelor romane în număr întreg:

  • Împărțiți șirul de numere romane în simboluri romane (caracter).
  • Convertiți fiecare simbol al cifrelor romane în valoarea pe care o reprezintă.
  • Luați simbolul unul câte unul pornind de la indicele 0:
    • Dacă valoarea curentă a simbolului este mai mare sau egală cu valoarea simbolului următor, adăugați această valoare la totalul cumulat.
    • altfel scade această valoare adăugând valoarea simbolului următor la totalul cumulat.

Mai jos este implementarea algoritmului de mai sus:

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) { // Valoarea simbolului curent // este mai mare sau egală cu // următorul simbol res = res + s1;  } else { // Valoarea simbolului curent este // mai mică decât simbolul următor res = res + s2 - s1;  i++;  } } else { res = res + s1;  } } return res; } // Cod driver int main() { // Considerând că intrările date sunt șir valid 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) { // Valoarea simbolului curent // este mai mare sau egală cu // următorul simbol res = res + s1;  } else { // Valoarea simbolului curent este // mai mică decât simbolul următor res = res + s2 - s1;  i++;  } } else { res = res + s1;  } } return res; } // Cod driver int main() { // Considerând că intrările date sunt valide char str[10] = 'MCMIV';  printf('Forma întreagă a numerelor romane este %d',romanToDecimal(str));  întoarce 0; }>>>Java= s2) { // Valoarea simbolului curent // este mai mare sau egală cu // simbolul următor res = res + s1;  } else { // Valoarea simbolului curent este // mai mică decât simbolul următor res = res + s2 - s1;  i++;  } } else { res = res + s1;  } } return res;  } // Cod driver public static void main(String args[]) { RomanToNumber ob = new RomanToNumber();  // Considerând că intrările date sunt valide String str = 'MCMIV';  System.out.println('Forma întreagă a numerelor romane' + ' este ' + ob.romanToDecimal(str));  } }>>>Piton= s2): # Valoarea simbolului curent este mai mare # sau egală cu următorul simbol res = res + s1 i = i + 1 else: # Valoarea simbolului curent este mai mare # sau egală cu următorul simbol res = res + s2 - s1 i = i + 2 else: res = res + s1 i = i + 1 return res # Cod driver print('Forma întreagă a cifrei romane este'), print(romanToDecimal('MCMIV'))>'>C#= s2) { // Valoarea simbolului curent este mai mare // sau egală cu următorul simbol res = res + s1;  } else { res = res + s2 - s1;  i++; // Valoarea simbolului curent este // mai mică decât simbolul următor } } else { res = res + s1;  i++;  } } return res;  } // Cod driver public static void Main(string[] args) { GFG ob = new GFG();  // Considerând că intrările date sunt șir valid str = 'MCMIV';  Console.WriteLine('Forma întreagă a numerelor romane' + ' este ' + ob.romanToDecimal(str));  } } // Acest cod este contribuit de Shrikant13>>Javascript= s2) { // Valoarea simbolului curent // este mai mare sau egală cu // simbolul următor res = res + s1;  } else { // Valoarea simbolului curent este // mai mică decât simbolul următor res = res + s2 - s1;  i++;  } } else { res = res + s1;  } } return res;  } // Cod driver // Considerând că intrările date sunt valide var str = 'MCMIV';  document.write('Forma întreagă a numerelor romane' + ' este ' + romanToDecimal(str)); // Acest cod este contribuit de umadevi9616>>>PHP= $s2) { // Valoarea simbolului curent // este mai mare sau egală cu // următorul simbol $res = $res + $s1; } else { $res = $res + $s2 - $s1; $i++; // Valoarea simbolului curent este // mai mică decât simbolul următor } } else { $res = $res + $s1; $i++; } } return $res; } // Cod driver // Considerând că intrările // date sunt valide $str ='MCMIV'; echo 'Forma întreagă a numerelor romane este ', romanToDecimal($str), '
'; // Acest cod este contribuit de ajit ?>>

Ieșire
Integer form of Roman Numeral is 1904>

Analiza complexității:

  • Complexitatea timpului: O(n), unde n este lungimea șirului.
    Este necesară o singură parcurgere a șirului.
  • Spațiu auxiliar: O(1), deoarece nu este necesar spațiu suplimentar.