logo

Konvertering af romertal til heltal

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:

Input: IX
Produktion: 9
Forklaring: IX er et romersk symbol, der repræsenterer 9

Input: XL
Produktion: 40
Forklaring: XL er et romersk symbol, der repræsenterer 40

Input: MCMIV
Produktion: 1904
Forklaring: M er tusind, CM er ni hundrede og IV er fire

netværksoperativsystem
Anbefalet praksis romersk tal til heltal Prøv det!

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.