logo

Convertir nombres romans a enters

Donada una cadena en forma romana, la tasca és convertir aquesta cadena romana donada en un nombre enter.

Nombres romans es basen en els símbols següents:



Símbol

Valor

jo



si més si java

1

EN

5



X

puntuació de precisió de sklearn

10

L

50

C

100

polimorfisme java

D

500

M

1000

Python de cerca binària

Exemple:

Entrada: IX
Sortida: 9
Explicació: IX és un símbol romà que representa 9

Entrada: XL
Sortida: 40
Explicació: XL és un símbol romà que representa 40

Entrada: MCMIV
Sortida: 1904
Explicació: M és mil, CM nou-cents i IV quatre

Pràctica recomanada Nombre romà a enter Prova-ho!

Enfocament: Un nombre en números romans és una cadena d'aquests símbols escrits en ordre descendent (per exemple, la primera M, seguida de la D, etc.). Tanmateix, en alguns casos específics, per evitar que es repeteixin quatre caràcters en successió (com ara IIII o XXXX), notació subtractiva s'utilitza sovint de la següent manera:

  • jo col·locat abans EN o X indica un menys, així que quatre ho són IV (un menys de 5) i 9 és IX (un menys de 10).
  • X col·locat abans L o C indica deu menys, així que quaranta són XL (10 menys de 50) i 90 és XC (deu menys de cent).
  • C col·locat abans D o M indica cent menys, així que quatre-cents ho són CD (cent menys que cinc-cents) i nou-cents és CM (cent menys que mil).

Algorisme per convertir nombres romans a nombre enter:

  • Dividiu la cadena de números romans en símbols romans (caràcter).
  • Converteix cada símbol de números romans en el valor que representa.
  • Agafeu el símbol un per un a partir de l'índex 0:
    • Si el valor actual del símbol és superior o igual al valor del símbol següent, afegiu aquest valor al total acumulat.
    • en cas contrari, resteu aquest valor afegint el valor del símbol següent al total acumulat.

A continuació es mostra la implementació de l'algorisme anterior:

compara cadenes java
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) { // El valor del símbol actual // és major o igual que // el símbol següent res = res + s1;  } else { // El valor del símbol actual és // menor que el següent símbol res = res + s2 - s1;  i++;  } } else { res = res + s1;  } } retorn res; } // Codi del controlador int main() { // Tenint en compte que les entrades donades són una cadena vàlida 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) { // El valor del símbol actual // és major o igual que // el símbol següent res = res + s1;  } else { // El valor del símbol actual és // menor que el següent símbol res = res + s2 - s1;  i++;  } } else { res = res + s1;  } } retorn res; } // Codi del controlador int main() { // Tenint en compte que les entrades donades són vàlides char str[10] = 'MCMIV';  printf('La forma entera del nombre romà és %d',romanToDecimal(str));  retorn 0; }>>>Java= s2) { // El valor del símbol actual // és major o igual a // el símbol següent res = res + s1;  } else { // El valor del símbol actual és // menor que el següent símbol res = res + s2 - s1;  i++;  } } else { res = res + s1;  } } retorn res;  } // Codi del controlador public static void main(String args[]) { RomanToNumber ob = new RomanToNumber();  // Tenint en compte que les entrades donades són vàlides String str = 'MCMIV';  System.out.println('Forma entera del nombre romà' + ' és ' + ob.romanToDecimal(str));  } }>>>Python= s2): # El valor del símbol actual és més gran # o igual al símbol següent res = res + s1 i = i + 1 més: # El valor del símbol actual és més gran # o igual al símbol següent res = res + s2 - s1 i = i + 2 else: res = res + s1 i = i + 1 return res # Codi del controlador print('Forma entera del número romà és'), print(romanToDecimal('MCMIV'))>'>C#= s2) { // El valor del símbol actual és major // o igual al següent símbol res = res + s1;  } else { res = res + s2 - s1;  i++; // El valor del símbol actual és // menor que el següent símbol } } else { res = res + s1;  i++;  } } retorn res;  } // Codi del controlador public static void Main(string[] args) { GFG ob = new GFG();  // Tenint en compte que les entrades donades són una cadena vàlida str = 'MCMIV';  Console.WriteLine('Forma entera del nombre romà' + ' és ' + ob.romanToDecimal(str));  } } // Aquest codi és aportat per Shrikant13>>Javascript= s2) { // El valor del símbol actual // és major o igual a // el símbol següent res = res + s1;  } else { // El valor del símbol actual és // menor que el següent símbol res = res + s2 - s1;  i++;  } } else { res = res + s1;  } } retorn res;  } // Codi del controlador // Tenint en compte que les entrades donades són vàlides var str = 'MCMIV';  document.write('Forma entera del número romà' + ' és ' + romanToDecimal(str)); // Aquest codi és aportat per umadevi9616>
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) { // El valor del símbol actual // és major o igual que // el següent símbol $res = $res + $s1; } else { $res = $res + $s2 - $s1; $i++; // El valor del símbol actual és // menor que el següent símbol } } else { $res = $res + $s1; $i++; } } retorn $res; } // Codi del controlador // Tenint en compte que les entrades // donades són vàlides $str ='MCMIV'; echo 'La forma entera del nombre romà és ', romanToDecimal($str), '
'; // Aquest codi és aportat per ajit ?>>

Sortida
Integer form of Roman Numeral is 1904>

Anàlisi de complexitat:

  • Complexitat temporal: O(n), on n és la longitud de la corda.
    Només cal un recorregut de la cadena.
  • Espai auxiliar: O(1), ja que no cal espai addicional.