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:
Practică recomandată Numărul roman la întreg Încercați!Intrare: IX
Ieșire: 9
Explicaţie: IX este un simbol roman care reprezintă 9mylivecricket.Intrare: XL
Ieșire: 40
Explicaţie: XL este un simbol roman care reprezintă 40subșirul java conțineIntrare: MCMIV
Ieșire: 1904
Explicaţie: M este o mie, CM este nouă sute și IV este patru
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.