logo

Převod římských číslic na celé číslo

Zadaný řetězec v římském tvaru je úkolem převést tento daný římský řetězec na celé číslo.

římské číslice jsou založeny na následujících symbolech:



Symbol

Hodnota



gimp exportovat jako jpg

1

V

5



X

abc s čísly

10

L

padesáti

věk shilpa shetty

C

100

D

500

tisknout vzor hvězdy

M

1000

Příklad:

Vstup: IX
Výstup: 9
Vysvětlení: IX je římský symbol, který představuje 9

Vstup: XL
Výstup: 40
Vysvětlení: XL je římský symbol, který představuje 40

Vstup: MCMIV
Výstup: 1904
Vysvětlení: M je tisíc, CM je devět set a IV jsou čtyři

Doporučený postup Roman Number to Integer Vyzkoušejte to!

Přístup: Číslo v římských číslicích je řetězec těchto symbolů zapsaný v sestupném pořadí (např. první M, následované D atd.). V několika konkrétních případech, aby se předešlo opakování čtyř znaků za sebou (například IIII nebo XXXX), subtraktivní notace se často používá následovně:

  • umístěna před V nebo X znamená o jednu méně, takže čtyři jsou IV (o jedno méně než 5) a 9 je IX (o jedno méně než 10).
  • X umístěna před L nebo C znamená o deset méně, tedy čtyřicet XL (10 méně než 50) a 90 je XC (o deset méně než sto).
  • C umístěna před D nebo M znamená o sto méně, takže čtyři sta je CD (sto méně než pět set) a devět set je CM (o sto méně než tisíc).

Algoritmus pro převod římských číslic na celé číslo:

java cast string to int
  • Rozdělte řetězec římských čísel na římské symboly (znak).
  • Převeďte každý symbol římských číslic na hodnotu, kterou představuje.
  • Vezměte symbol jeden po druhém od indexu 0:
    • Pokud je aktuální hodnota symbolu větší nebo rovna hodnotě dalšího symbolu, pak tuto hodnotu přičtěte k průběžnému součtu.
    • jinak tuto hodnotu odečtěte přidáním hodnoty dalšího symbolu k průběžnému součtu.

Následuje implementace výše uvedeného algoritmu:

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) { // Hodnota aktuálního symbolu // je větší nebo rovna // další symbol res = res + s1;  } else { // Hodnota aktuálního symbolu je // menší než následující symbol res = res + s2 - s1;  i++;  } } else { res = res + s1;  } } return res; } // Kód ovladače int main() { // S ohledem na zadané vstupy jsou platné řetězce 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) { // Hodnota aktuálního symbolu // je větší nebo rovna // další symbol res = res + s1;  } else { // Hodnota aktuálního symbolu je // menší než následující symbol res = res + s2 - s1;  i++;  } } else { res = res + s1;  } } return res; } // Kód ovladače int main() { // Vzhledem k tomu, že zadané vstupy jsou platné char str[10] = 'MCMIV';  printf('Celočíselná forma římské číslice je %d',romanToDecimal(str));  návrat 0; }>
Jáva
// 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) { // Hodnota aktuálního symbolu // je větší nebo rovna // další symbol res = res + s1;  } else { // Hodnota aktuálního symbolu je // menší než následující symbol res = res + s2 - s1;  i++;  } } else { res = res + s1;  } } return res;  } // Kód ovladače public static void main(String args[]) { RomanToNumber ob = new RomanToNumber();  // Vzhledem k tomu, že zadané vstupy jsou platné String str = 'MCMIV';  System.out.println('Celočíselný tvar římského čísla' + ' je ' + ob.romanToDecimal(str));  } }>
Krajta
# 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): # Hodnota aktuálního symbolu je větší # nebo rovna dalšímu symbolu res = res + s1 i = i + 1 else: # Hodnota aktuálního symbolu je větší # nebo rovna dalšímu symbolu res = res + s2 - s1 i = i + 2 else: res = res + s1 i = i + 1 return res # Tisk kódu ovladače ('Celočíselná forma římské číslice je'), print(romanToDecimal('MCMIV'))>'>C#= s2) { // Hodnota aktuálního symbolu je větší // nebo rovna dalšímu symbolu res = res + s1;  } else { res = res + s2 - s1;  i++; // Hodnota aktuálního symbolu je // menší než následující symbol } } else { res = res + s1;  i++;  } } return res;  } // Kód ovladače public static void Main(string[] args) { GFG ob = new GFG();  // S ohledem na zadané vstupy jsou platné řetězce str = 'MCMIV';  Console.WriteLine('Celočíselný tvar římského čísla' + ' je ' + ob.romanToDecimal(str));  } } // Tento kód přispěl 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) { // Hodnota aktuálního symbolu // je větší nebo rovna // dalšímu symbolu $res = $res + $s1; } else { $res = $res + $s2 - $s1; $i++; // Hodnota aktuálního symbolu je // menší než následující symbol } } else { $res = $res + $s1; $i++; } } return $res; } // Kód ovladače // Vzhledem k tomu, že vstupy // jsou platné $str ='MCMIV'; echo 'Celočíselný tvar římské číslice je ', romanToDecimal($str), '
'; // Tento kód přispěl ajit ?>>

Výstup
Integer form of Roman Numeral is 1904>

Analýza složitosti:

  • Časová náročnost: O(n), kde n je délka řetězce.
    Je vyžadován pouze jeden průchod řetězce.
  • Pomocný prostor: O(1), protože není potřeba žádné místo navíc.