logo

Romiešu ciparu pārvēršana veselos skaitļos

Ja ir dota virkne romiešu formā, uzdevums ir pārvērst šo doto romiešu virkni par veselu skaitli.

Romiešu cipari ir balstīti uz šādiem simboliem:



Simbols

Vērtība

es



šķēle java

1

IN

5



X

kā piekļūt icloud fotoattēliem

10

L

piecdesmit

C

100

virkne java metodēs

D

500

M

1000

java kolekcijas java

Piemērs:

Ievade: IX
Izvade: 9
Paskaidrojums: IX ir romiešu simbols, kas apzīmē 9

Ievade: XL
Izvade: 40
Paskaidrojums: XL ir romiešu simbols, kas apzīmē 40

Ievade: MCMIV
Izvade: 1904. gads
Paskaidrojums: M ir tūkstotis, CM ir deviņi simti un IV ir četri

Ieteicamā prakse no romiešu skaitļa līdz veselam skaitļam Izmēģiniet to!

Pieeja: Skaitlis ar romiešu cipariem ir šo simbolu virkne, kas rakstīta dilstošā secībā (piem., vispirms M, kam seko D utt.). Tomēr dažos īpašos gadījumos, lai izvairītos no četru rakstzīmju atkārtošanās pēc kārtas (piemēram, IIII vai XXXX), atņemšanas apzīmējums bieži izmanto šādi:

  • es novietots pirms IN vai X norāda par vienu mazāk, tātad četri ir IV (viens mazāks par 5) un 9 ir IX (viens mazāks par 10).
  • X novietots pirms L vai C norāda par desmit mazāk, tātad četrdesmit ir XL (10 mazāk par 50) un 90 ir XC (desmit mazāk par simtu).
  • C novietots pirms D vai M norāda simts mazāk, tātad četri simti ir CD (simts mazāk nekā pieci simti) un deviņi simti ir CM (simts mazāk nekā tūkstotis).

Algoritms romiešu ciparu pārvēršanai veselos skaitļos:

  • Sadaliet romiešu ciparu virkni romiešu simbolos (rakstzīmēs).
  • Pārvērtiet katru romiešu ciparu simbolu vērtībā, ko tas pārstāv.
  • Paņemiet simbolu pa vienam, sākot no indeksa 0:
    • Ja pašreizējā simbola vērtība ir lielāka vai vienāda ar nākamā simbola vērtību, pievienojiet šo vērtību tekošajai kopsummai.
    • citādi atņemiet šo vērtību, pievienojot nākamā simbola vērtību tekošajai kopsummai.

Tālāk ir norādīta iepriekš minētā algoritma ieviešana.

java formāta virkne
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) { // Pašreizējā simbola vērtība // ir lielāka vai vienāda ar // nākamo simbolu res = res + s1;  } else { // Pašreizējā simbola vērtība ir // mazāka par nākamo simbolu res = res + s2 - s1;  i++;  } } else { res = res + s1;  } } return res; } // Draivera kods int main() { // Ņemot vērā, ka ievadītās ievades ir derīgas string 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) { // Pašreizējā simbola vērtība // ir lielāka vai vienāda ar // nākamo simbolu res = res + s1;  } else { // Pašreizējā simbola vērtība ir // mazāka par nākamo simbolu res = res + s2 - s1;  i++;  } } else { res = res + s1;  } } return res; } // Draivera kods int main() { // Ņemot vērā, ka ievadītās ievades ir derīgas char str[10] = 'MCMIV';  printf('Romiešu skaitļa vesela skaitļa forma ir %d',romanToDecimal(str));  atgriezties 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) { // Pašreizējā simbola vērtība // ir lielāka vai vienāda ar // nākamo simbolu res = res + s1;  } else { // Pašreizējā simbola vērtība ir // mazāka par nākamo simbolu res = res + s2 - s1;  i++;  } } else { res = res + s1;  } } return res;  } // Draivera kods public static void main(String args[]) { RomanToNumber ob = new RomanToNumber();  // Ņemot vērā, ka ievadītās ievades ir derīgas String str = 'MCMIV';  System.out.println('Romiešu skaitļa vesela skaitļa forma' + ' ir ' + 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): # Pašreizējā simbola vērtība ir lielāka # vai vienāda ar nākamo simbolu res = res + s1 i = i + 1 else: # Pašreizējā simbola vērtība ir lielāka # vai vienāda ar nākamo simbolu res = res + s2 - s1 i = i + 2 else: res = res + s1 i = i + 1 return res # Draivera kods print('Roman cipara vesels skaitlis ir'), print(romanToDecimal('MCMIV'))>'>C#= s2) { // Pašreizējā simbola vērtība ir lielāka // vai vienāda ar nākamo simbolu res = res + s1;  } else { res = res + s2 - s1;  i++; // Pašreizējā simbola vērtība ir // mazāka par nākamo simbolu } } else { res = res + s1;  i++;  } } return res;  } // Draivera kods public static void Main(string[] args) { GFG ob = new GFG();  // Ņemot vērā, ka ievadītās ievades ir derīgas virknes str = 'MCMIV';  Console.WriteLine('Romiešu skaitļa vesela skaitļa forma' + ' ir ' + ob.romanToDecimal(str));  } } // Šo kodu ir sagatavojis Shrikant13>
Javascript
>>PHP= $s2) { // Pašreizējā simbola vērtība // ir lielāka vai vienāda ar // nākamo simbolu $res = $res + $s1; } else { $res = $res + $s2 - $s1; $i++; // Pašreizējā simbola vērtība ir // mazāka par nākamo simbolu } } else { $res = $res + $s1; $i++; } } return $res; } // Draivera kods // Ņemot vērā ievades // dotās ir derīgas $str ='MCMIV'; echo 'Romiešu skaitļa vesela skaitļa forma ir ', romanToDecimal($str), '
'; // Šo kodu ir sagatavojis ajit ?>>

Izvade
Integer form of Roman Numeral is 1904>

Sarežģītības analīze:

  • Laika sarežģītība: O(n), kur n ir virknes garums.
    Ir nepieciešama tikai viena virknes šķērsošana.
  • Palīgtelpa: O(1), jo nav nepieciešama papildu vieta.