Podan je niz v rimski obliki, naloga je pretvoriti ta dani rimski niz v celo število.
rimske številke temeljijo na naslednjih simbolih:
Simbol | Vrednost |
|---|---|
jaz kaj je f5 na tipkovnici | 1 |
IN | 5 |
X java if else stavek | 10 |
L | petdeset |
C | 100 ogrodje zbirk java |
D | 500 |
M | 1000 100 kmh do mph |
primer:
Priporočena praksa Rimska številka v celo število Poskusite!Vnos: IX
Izhod: 9
Pojasnilo: IX je rimski simbol, ki predstavlja 9Vnos: XL
Izhod: 40
Pojasnilo: XL je rimski simbol, ki predstavlja 40Vnos: MCMIV
Izhod: 1904
Pojasnilo: M je tisoč, CM je devetsto in IV je štiri
Pristop: Število z rimskimi številkami je niz teh simbolov, napisanih v padajočem vrstnem redu (npr. najprej M, sledijo mu D itd.). Vendar pa v nekaj posebnih primerih, da se izognete zaporednemu ponavljanju štirih znakov (na primer IIII ali XXXX), subtraktivni zapis se pogosto uporablja na naslednji način:
- jaz postavljen pred IN oz X označuje eno manj, torej štiri IV (ena manj kot 5) in 9 je IX (ena manj kot 10).
- X postavljen pred L oz C označuje deset manj, torej štirideset XL (10 manj kot 50) in 90 je XC (deset manj kot sto).
- C postavljen pred D oz M označuje sto manj, torej je štiristo CD (sto manj kot petsto) in devetsto je CM (sto manj kot tisoč).
Algoritem za pretvorbo rimskih številk v celo število:
- Niz rimskih številk razdelite na rimske simbole (znak).
- Vsak simbol rimskih številk pretvorite v vrednost, ki jo predstavlja.
- Vzemite simbol enega za drugim, začenši z indeksom 0:
- Če je trenutna vrednost simbola večja ali enaka vrednosti naslednjega simbola, dodajte to vrednost tekoči vsoti.
- drugače odštejte to vrednost tako, da dodate vrednost naslednjega simbola tekoči vsoti.
Sledi izvedba zgornjega algoritma:
np pomeniC++
// 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) { // Vrednost trenutnega simbola // je večja ali enaka // naslednjemu simbolu res = res + s1; } else { // Vrednost trenutnega simbola je // manjša od naslednjega simbola res = res + s2 - s1; i++; } } else { res = res + s1; } } vrni res; } // Koda gonilnika int main() { // Ob upoštevanju, da so dani vnosi veljavni 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) { // Vrednost trenutnega simbola // je večja ali enaka // naslednjemu simbolu res = res + s1; } else { // Vrednost trenutnega simbola je // manjša od naslednjega simbola res = res + s2 - s1; i++; } } else { res = res + s1; } } vrni res; } // Koda gonilnika int main() { // Ob upoštevanju, da so dani vnosi veljavni char str[10] = 'MCMIV'; printf('Cela oblika rimske številke je %d',romanToDecimal(str)); vrni 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) { // Vrednost trenutnega simbola // je večja ali enaka // naslednjemu simbolu res = res + s1; } else { // Vrednost trenutnega simbola je // manjša od naslednjega simbola res = res + s2 - s1; i++; } } else { res = res + s1; } } vrni res; } // Koda gonilnika public static void main(String args[]) { RomanToNumber ob = new RomanToNumber(); // Ob upoštevanju, da so dani vnosi veljavni String str = 'MCMIV'; System.out.println('Cela oblika rimske številke' + ' je ' + 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): # Vrednost trenutnega simbola je večja # ali enaka naslednjemu simbolu res = res + s1 i = i + 1 else: # Vrednost trenutnega simbola je večja # ali enaka naslednjemu simbolu res = res + s2 - s1 i = i + 2 else: res = res + s1 i = i + 1 return res # Koda gonilnika print('Cela oblika rimske številke je'), print(romanToDecimal('MCMIV'))>'>C#= s2) { // Vrednost trenutnega simbola je večja // ali enaka naslednjemu simbolu res = res + s1; } else { res = res + s2 - s1; i++; // Vrednost trenutnega simbola je // manjša od naslednjega simbola } } else { res = res + s1; i++; } } vrni res; } // Koda gonilnika public static void Main(string[] args) { GFG ob = new GFG(); // Ob upoštevanju, da so podani vnosi veljavni niz str = 'MCMIV'; Console.WriteLine('Cela oblika rimske številke' + ' je ' + ob.romanToDecimal(str)); } } // To kodo je prispeval 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) { // Vrednost trenutnega simbola // je večja ali enaka // naslednjemu simbolu $res = $res + $s1; } else { $res = $res + $s2 - $s1; $i++; // Vrednost trenutnega simbola je // manjša od naslednjega simbola } } else { $res = $res + $s1; $i++; } } vrni $res; } // Koda gonilnika // Upoštevanje vnosov // so veljavni $str ='MCMIV'; echo 'Cela oblika rimske številke je ', romanToDecimal($str), '
'; // To kodo je prispeval ajit ?>> Izhod
Integer form of Roman Numeral is 1904>
Analiza kompleksnosti:
- Časovna zapletenost: O(n), kjer je n dolžina niza.
Potreben je samo en prehod niza. - Pomožni prostor: O(1), ker ni potreben dodaten prostor.