Gitt en streng i romersk form, er oppgaven å konvertere denne gitte romerske strengen til et heltall.
romertall er basert på følgende symboler:
Symbol | Verdi |
|---|---|
Jeg sammenlignet metode java | 1 |
I | 5 |
X dobbeltlenket liste | 10 |
L | femti |
C linux merke | 100 |
D | 500 |
M java arv | 1000 |
Eksempel:
Anbefalt praksis romertall til heltall Prøv det!Inndata: IX
Produksjon: 9
Forklaring: IX er et romersk symbol som representerer 9Inndata: XL
Produksjon: 40
Forklaring: XL er et romersk symbol som representerer 40Inndata: MCMIV
Produksjon: 1904
Forklaring: M er tusen, CM er ni hundre og IV er firehva er orakel
Nærme seg: Et tall i romertall er en streng av disse symbolene skrevet i synkende rekkefølge (f.eks. M først, etterfulgt av D, osv.). Men i noen få spesifikke tilfeller, for å unngå at fire tegn gjentas etter hverandre (som IIII eller XXXX), subtraktiv notasjon brukes ofte som følger:
- Jeg plassert før I eller X indikerer en mindre, så fire er IV (en mindre enn 5) og 9 er IX (en mindre enn 10).
- X plassert før L eller C indikerer ti mindre, så førti er XL (10 mindre enn 50) og 90 er XC (ti mindre enn hundre).
- C plassert før D eller M indikerer hundre mindre, så fire hundre er CD (hundre mindre enn fem hundre) og ni hundre er CM (hundre mindre enn tusen).
Algoritme for å konvertere romertall til heltall:
- Del romertallstrengen i romerske symboler (tegn).
- Konverter hvert symbol med romertall til verdien det representerer.
- Ta symbol ett etter ett fra start fra indeks 0:
- Hvis gjeldende symbolverdi er større enn eller lik verdien til neste symbol, legg til denne verdien til totalsummen.
- ellers trekker du denne verdien ved å legge til verdien av neste symbol til totalsummen.
Følgende er implementeringen av algoritmen ovenfor:
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) { // Verdien av gjeldende symbol // er større eller lik // neste symbol res = res + s1; } else { // Verdien av gjeldende symbol er // mindre enn det neste symbolet res = res + s2 - s1; i++; } } annet { res = res + s1; } } returner res; } // Driverkode int main() { // Vurderer inndata som er gitt 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) { // Verdien av gjeldende symbol // er større eller lik // neste symbol res = res + s1; } else { // Verdien av gjeldende symbol er // mindre enn det neste symbolet res = res + s2 - s1; i++; } } annet { res = res + s1; } } returner res; } // Driverkode int main() { // Vurderer at inndataene er gyldige char str[10] = 'MCMIV'; printf('Heltallsform av romertall er %d',romanToDecimal(str)); returner 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) { // Verdien av gjeldende symbol // er større eller lik // neste symbol res = res + s1; } else { // Verdien av gjeldende symbol er // mindre enn det neste symbolet res = res + s2 - s1; i++; } } annet { res = res + s1; } } returner res; } // Driver Code public static void main(String args[]) { RomanToNumber ob = new RomanToNumber(); // Vurderer at inndataene er gyldige String str = 'MCMIV'; System.out.println('Heltallsform av romertall' + ' 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): # Verdien av gjeldende symbol er større # eller lik neste symbol res = res + s1 i = i + 1 annet: # Verdien av gjeldende symbol er større # eller lik neste symbol res = res + s2 - s1 i = i + 2 annet: res = res + s1 i = i + 1 retur res # Driverkode print('Heltallsform av romertall er'), print(romanToDecimal('MCMIV'))>'>C#= s2) { // Verdien av gjeldende symbol er større // eller lik neste symbol res = res + s1; } annet { res = res + s2 - s1; i++; // Verdien av gjeldende symbol er // mindre enn det neste symbolet } } else { res = res + s1; i++; } } returner res; } // Driver Code public static void Main(string[] args) { GFG ob = new GFG(); // Vurderer at inndataene er gyldige str = 'MCMIV'; Console.WriteLine('Heltallsform av romertall' + ' er ' + ob.romanToDecimal(str)); } } // Denne koden er bidratt av 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) { // Verdien av gjeldende symbol // er større eller lik // neste symbol $res = $res + $s1; } annet { $res = $res + $s2 - $s1; $i++; // Verdien av gjeldende symbol er // mindre enn det neste symbolet } } else { $res = $res + $s1; $i++; } } returner $res; } // Driverkode // Vurderer inndata // gitt er gyldige $str ='MCMIV'; echo 'Heltallsform av romertall er ', romanToDecimal($str), '
'; // Denne koden er bidratt av ajit ?>> Produksjon
Integer form of Roman Numeral is 1904>
Kompleksitetsanalyse:
- Tidskompleksitet: O(n), hvor n er lengden på strengen.
Bare én kryssing av strengen er nødvendig. - Hjelpeplass: O(1), Siden det ikke kreves ekstra plass.