Givet en streng i romersk form, er opgaven at konvertere denne givne romerske streng til et heltal.
romertal er baseret på følgende symboler:
Symbol | Værdi |
|---|---|
jeg tæller adskilt | 1 |
I | 5 |
x dobbelt linket liste | 10 |
L | halvtreds |
C cast en streng til int java | 100 |
D | 500 |
M java arv | 1000 |
Eksempel:
Anbefalet praksis romersk tal til heltal Prøv det!Input: IX
Produktion: 9
Forklaring: IX er et romersk symbol, der repræsenterer 9Input: XL
Produktion: 40
Forklaring: XL er et romersk symbol, der repræsenterer 40Input: MCMIV
Produktion: 1904
Forklaring: M er tusind, CM er ni hundrede og IV er firenetværksoperativsystem
Nærme sig: Et tal i romertal er en række af disse symboler skrevet i faldende rækkefølge (f.eks. M'er først, efterfulgt af D'er osv.). Men i nogle få specifikke tilfælde, for at undgå, at fire tegn gentages i rækkefølge (såsom IIII eller XXXX), subtraktiv notation bruges ofte som følger:
- jeg placeret før I eller x angiver en mindre, så fire er IV (én mindre end 5) og 9 er IX (en mindre end 10).
- x placeret før L eller C angiver ti mindre, så fyrre er XL (10 mindre end 50) og 90 er XC (ti mindre end hundrede).
- C placeret før D eller M angiver hundrede mindre, så fire hundrede er CD (hundrede mindre end fem hundrede) og ni hundrede er CM (hundrede mindre end tusind).
Algoritme til at konvertere romertal til heltal:
- Opdel den romerske talstreng i romerske symboler (tegn).
- Konverter hvert symbol med romertal til den værdi, det repræsenterer.
- Tag symbolet et efter et fra start fra indeks 0:
- Hvis den aktuelle værdi af symbolet er større end eller lig med værdien af det næste symbol, skal du tilføje denne værdi til den løbende total.
- ellers trækker du denne værdi fra ved at tilføje værdien af næste symbol til den løbende total.
Følgende er implementeringen af ovenstående algoritme:
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) { // Værdien af det aktuelle symbol // er større eller lig med // det næste symbol res = res + s1; } else { // Værdien af det aktuelle symbol er // mindre end det næste symbol res = res + s2 - s1; i++; } } andet { res = res + s1; } } returner res; } // Driverkode int main() { // I betragtning af de givne inputs er gyldig streng 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) { // Værdien af det aktuelle symbol // er større eller lig med // det næste symbol res = res + s1; } else { // Værdien af det aktuelle symbol er // mindre end det næste symbol res = res + s2 - s1; i++; } } andet { res = res + s1; } } returner res; } // Driverkode int main() { // I betragtning af de givne input er gyldige char str[10] = 'MCMIV'; printf('Heltalsform af romertal er %d',romanToDecimal(str)); retur 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) { // Værdien af det aktuelle symbol // er større eller lig med // det næste symbol res = res + s1; } else { // Værdien af det aktuelle symbol er // mindre end det næste symbol res = res + s2 - s1; i++; } } andet { res = res + s1; } } returner res; } // Driverkode public static void main(String args[]) { RomanToNumber ob = new RomanToNumber(); // I betragtning af de givne input er gyldige String str = 'MCMIV'; System.out.println('Heltalsform af romertal' + ' er ' + 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): # Værdien af det aktuelle symbol er større # eller lig med det næste symbol res = res + s1 i = i + 1 andet: # Værdien af det aktuelle symbol er større # eller lig med det næste symbol res = res + s2 - s1 i = i + 2 andet: res = res + s1 i = i + 1 retur res # Driverkode print('Heltalsform af romertal er'), print(romanToDecimal('MCMIV'))>'>C#= s2) { // Værdien af det aktuelle symbol er større // eller lig med det næste symbol res = res + s1; } andet { res = res + s2 - s1; i++; // Værdien af det aktuelle symbol er // mindre end det næste symbol } } else { res = res + s1; i++; } } returner res; } // Driver Code public static void Main(string[] args) { GFG ob = new GFG(); // I betragtning af de givne input er gyldig streng str = 'MCMIV'; Console.WriteLine('Heltalsform af romertal' + ' er ' + ob.romanToDecimal(str)); } } // Denne kode er bidraget af 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) { // Værdien af det aktuelle symbol // er større eller lig med // det næste symbol $res = $res + $s1; } andet { $res = $res + $s2 - $s1; $i++; // Værdien af det aktuelle symbol er // mindre end det næste symbol } } else { $res = $res + $s1; $i++; } } returner $res; } // Driverkode // I betragtning af input // givet er gyldige $str ='MCMIV'; echo 'Heltalsform af romertal er ', romanToDecimal($str), '
'; // Denne kode er bidraget af ajit ?>> Produktion
Integer form of Roman Numeral is 1904>
Kompleksitetsanalyse:
- Tidskompleksitet: O(n), hvor n er længden af strengen.
Der kræves kun én gennemgang af strengen. - Hjælpeplads: O(1), Da der ikke kræves ekstra plads.