Дано рядок у латинській формі, завдання полягає в тому, щоб перетворити цей латинський рядок у ціле число.
римські цифри базуються на таких символах:
символ | Значення |
|---|---|
я поточна дата в java | 1 |
IN | 5 |
X java додати до масиву | 10 |
Л | п'ятдесят |
C .04 як дріб | 100 |
Д | 500 |
М myflixr | 1000 |
приклад:
Рекомендована практика Перетворення римського числа в ціле Спробуйте!введення: IX
Вихід: 9
Пояснення: IX — римський символ, що позначає 9введення: XL
Вихід: 40
Пояснення: XL — це римський символ, який позначає 40введення: MCMIV
Вихід: 1904 рік
Пояснення: M — тисяча, CM — дев’ятсот, IV — чотиритигр порівняно з левом
Підхід: Число римськими цифрами — це рядок цих символів, записаних у порядку спадання (наприклад, спочатку M, потім D тощо). Однак у деяких конкретних випадках, щоб уникнути повторення чотирьох символів поспіль (наприклад, IIII або XXXX), субтрактивний запис часто використовується наступним чином:
- я розміщені перед IN або X вказує на один менше, отже чотири IV (на одиницю менше 5), а 9 — це IX (на одиницю менше 10).
- X розміщені перед Л або C вказує на десять менше, отже сорок XL (10 менше 50) і 90 є XC (десять менше ста).
- C розміщені перед Д або М вказує на сто менше, отже, чотириста CD (сто менше п'ятисот) і дев'ятсот є СМ (сто менше тисячі).
Алгоритм перетворення римських цифр у ціле число:
- Розділіть рядок римських цифр на римські символи (символ).
- Перетворіть кожен символ римських цифр на значення, яке він представляє.
- Беріть символ один за одним, починаючи з індексу 0:
- Якщо поточне значення символу більше або дорівнює значенню наступного символу, додайте це значення до поточного підсумку.
- інакше відніміть це значення, додавши значення наступного символу до поточної суми.
Нижче наведено реалізацію наведеного вище алгоритму:
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) { // Значення поточного символу // більше або дорівнює // наступному символу res = res + s1; } else { // Значення поточного символу // менше наступного символу res = res + s2 - s1; i++; } } else { res = res + s1; } } return res; } // Код драйвера int main() { // Врахування наданих вхідних даних є дійсними 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) { // Значення поточного символу // більше або дорівнює // наступному символу res = res + s1; } else { // Значення поточного символу // менше наступного символу res = res + s2 - s1; i++; } } else { res = res + s1; } } return res; } // Код драйвера int main() { // Врахування наданих вхідних даних є дійсними char str[10] = 'MCMIV'; printf('Ціла форма римської цифри — %d',romanToDecimal(str)); повернути 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) { // Значення поточного символу // більше або дорівнює // наступному символу res = res + s1; } else { // Значення поточного символу // менше наступного символу res = res + s2 - s1; i++; } } else { res = res + s1; } } return res; } // Код драйвера public static void main(String args[]) { RomanToNumber ob = new RomanToNumber(); // Розглядаючи надані вхідні дані як дійсні String str = 'MCMIV'; System.out.println('Ціла форма римських цифр' + ' є ' + 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): # Значення поточного символу більше # або дорівнює наступному символу res = res + s1 i = i + 1 else: # Значення поточного символу більше # або дорівнює наступному символу res = res + s2 - s1 i = i + 2 else: res = res + s1 i = i + 1 return res # Код драйвера print('Ціла форма римських цифр є'), print(romanToDecimal('MCMIV'))>'>C#= s2) { // Значення поточного символу більше // або дорівнює наступному символу res = res + s1; } else { res = res + s2 - s1; i++; // Значення поточного символу // менше за наступний символ } } else { res = res + s1; i++; } } return res; } // Код драйвера public static void Main(string[] args) { GFG ob = new GFG(); // Розглядаючи надані вхідні дані як дійсні string str = 'MCMIV'; Console.WriteLine('Ціла форма римських цифр' + ' є ' + ob.romanToDecimal(str)); } } // Цей код створено 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) { // Значення поточного символу // більше або дорівнює // наступному символу $res = $res + $s1; } else { $res = $res + $s2 - $s1; $i++; // Значення поточного символу // менше за наступний символ } } else { $res = $res + $s1; $i++; } } return $res; } // Код драйвера // Врахування вхідних даних // наведені дані є дійсними $str ='MCMIV'; echo 'Ціла форма римських цифр — ', romanToDecimal($str), '
'; // Цей код створено ajit ?>> Вихід
Integer form of Roman Numeral is 1904>
Аналіз складності:
- Часова складність: O(n), де n - довжина рядка.
Потрібен лише один обхід рядка. - Допоміжний простір: O(1), оскільки додатковий простір не потрібен.