logo

الرومانية لتحويل عدد صحيح

جربه على ممارسة GfG ' title=

بالنظر إلى سلسلة تمثل رقمًا رومانيًا، ابحث عن قيمة العدد الصحيح المقابلة لها.
يتم تشكيل الأرقام الرومانية باستخدام الرموز التالية: I = 1 V = 5 X = 10 L = 50 C = 100 D = 500 وM = 1000.
يتم تشكيل الأرقام عادةً من خلال الجمع بين هذه الرموز من اليسار إلى اليمين وإضافة قيمها أو طرحها بناءً على قواعد محددة.

سلسلة جافا التسلسلية

كيف يعمل التحويل؟

  • إذا جاء رمز القيمة الأصغر قبل أن نطرح. وإلا نضيف.
  • في IV، تأتي I قبل V وV لها قيمة أكبر 5. إذن نتيجتنا هي 5 - 1 = 4.
  • في VI، تأتي V قبل I ولها قيمة أصغر 1. لذا فإن نتيجتنا هي 5 + 1 = 6.
  • في II لدينا نفس القيم لذا نجمع ونحصل على 1 + 1 = 2
  • في حالة وجود أكثر من حرفين، فإننا ننتقل من اليسار إلى اليمين ونجمع فقط عندما نرى حرفًا ذا قيمة أكبر بعد حرف ذي قيمة أصغر. على سبيل المثال، MXVII هو 1000 + 10 + 5 + 1 + 1 = 1017. وXLVII هو (50 - 10) + 5 + 1 + 1 = 47. لاحظ أن L أكبر ويأتي بعد X.

أمثلة:



مدخل: ق = 'التاسع'
الإخراج: 9
توضيح: IX هو رمز روماني يمثل 10 - 1 = 9

مدخل: الصورة = 'XL'
الإخراج: 40
توضيح: XL هو رمز روماني يمثل 50 - 10 = 40

مدخل: الصورة = 'MCMIV'
الإخراج: 1904
توضيح: M يساوي 1000 سم يساوي 1000 - 100 = 900 و IV يساوي 4. إذن لدينا المجموع 1000 + 900 + 4 = 1904

برمجة جافا الأعداد الأولية

جدول المحتويات

[النهج المتوقع 1] استخدام المقارنة التكرارية - وقت O(n) ومساحة O(1)

فكرة تحويل الرقم الروماني إلى عدد صحيح هي أنه يتعين علينا اجتياز السلسلة من اليسار إلى اليمين. لكل رمز قارنه بالرمز التالي (إن وجد). إذا كان الرمز الحالي أكبر من أو يساوي الرمز التالي، فقم بإضافة قيمته إلى النتيجة. وإلا قم بطرح قيمته من قيمة الرمز التالي وأضف النتيجة إلى الإجمالي وتخطي الرمز التالي.

قاموس فرز بايثون
C++
#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 numeral int romanToDecimal(string& s) {  int res = 0;   for (int i = 0; i < s.length(); i++) {    // get value of current symbol  int s1 = value(s[i]);  // Compare with the next symbol if it exists  if (i + 1 < s.length()) {  int s2 = value(s[i + 1]);  // if current value is greater or equal   // add it to result  if (s1 >= s2) {  res += s1;  }  else {  // else add the difference and skip   // next symbol  res += (s2 - s1);  i++;  }  }  else {  res += s1;  }  }  return res; } int main() {  string s = 'IX';  cout << romanToDecimal(s) << endl;  return 0; } 
Java
class GfG {  // this function returns value of a Roman symbol  static 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 numeral  static int romanToDecimal(String s) {  int res = 0;   for (int i = 0; i < s.length(); i++) {    //get value of current symbol  int s1 = value(s.charAt(i));  // compare with the next symbol if it exists  if (i + 1 < s.length()) {  int s2 = value(s.charAt(i + 1));  // If current value is greater or equal   // add it to result  if (s1 >= s2) {  res += s1;  }  else {  // else add the difference and skip   // next symbol  res += (s2 - s1);  i++;  }  }  else {  res += s1;  }  }  return res;  }  public static void main(String[] args) {  String s = 'IX';  System.out.println(romanToDecimal(s));  } } 
Python
# this function returns value of a 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 # returns decimal value of roman numeral def romanToDecimal(s): res = 0 i = 0 while i < len(s): # get value of current symbol s1 = value(s[i]) # compare with the next symbol if it exists if i + 1 < len(s): s2 = value(s[i + 1]) # if current value is greater or equal  # add it to result if s1 >= s2: res += s1 else: # else add the difference and  # skip next symbol res += (s2 - s1) i += 1 else: res += s1 i += 1 return res if __name__ == '__main__': s = 'IX' print(romanToDecimal(s)) 
C#
using System; class GfG {    // this function returns value of a Roman symbol  static 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 numeral  static int romanToDecimal(string s) {  int res = 0;   for (int i = 0; i < s.Length; i++) {    // get value of current symbol  int s1 = value(s[i]);  // compare with the next symbol if it exists  if (i + 1 < s.Length) {  int s2 = value(s[i + 1]);  // if current value is greater or equal   // add it to result  if (s1 >= s2) {  res += s1;  }  else {  // else add the difference and skip  // next symbol  res += (s2 - s1);  i++;  }  }  else {  res += s1;  }  }  return res;  }  static void Main() {  string s = 'IX';  Console.WriteLine(romanToDecimal(s));  } } 
JavaScript
// 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(s) {  let res = 0;   for (let i = 0; i < s.length; i++) {    // get value of current symbol  let s1 = value(s[i]);  // compare with the next symbol if it exists  if (i + 1 < s.length) {  let s2 = value(s[i + 1]);  // if current value is greater or equal   // add it to result  if (s1 >= s2) {  res += s1;  }  else {  // else add the difference and   // skip next symbol  res += (s2 - s1);  i++;  }  }  else {  res += s1;  }  }  return res; } // Driver Code let s = 'IX';  console.log(romanToDecimal(s)); 

الإخراج
9 

[النهج المتوقع 2] استخدام التجزئة - وقت O(n) ومساحة O(1).

يمكننا استخدام خريطة التجزئة أو القاموس لتخزين قيم الرموز الرومانية. ولحل المشكلة علينا التكرار عبر السلسلة ولكل رمز التحقق مما إذا كانت القيمة الحالية أقل من القيمة التالية. إذا كان الأمر كذلك، فاطرح القيمة الحالية من القيمة التالية وأضف النتيجة إلى الإجمالي. وإلا قم بإضافة القيمة الحالية إلى الإجمالي.

C++
#include    #include  using namespace std; int romanToDecimal(string &s) {  unordered_map<char int> romanMap = {{'I' 1}   {'V' 5}   {'X' 10}   {'L' 50}  {'C' 100}   {'D' 500}   {'M' 1000}};  int res = 0;  for (int i = 0; i < s.length(); i++) {  // if the current value is less than the next value   // subtract current from next and add to res  if (i + 1 < s.length() && romanMap[s[i]] < romanMap[s[i + 1]]) {  res += romanMap[s[i + 1]] - romanMap[s[i]];  // skip the next symbol  i++;  }  else {  // otherwise add the current value to res  res += romanMap[s[i]];  }  }  return res; } int main() {  string s = 'IX';  cout << romanToDecimal(s) << endl;  return 0; } 
Java
import java.util.HashMap; class GfG {  static int romanToDecimal(String s) {  HashMap<Character Integer> romanMap = new HashMap<>();  romanMap.put('I' 1);  romanMap.put('V' 5);  romanMap.put('X' 10);  romanMap.put('L' 50);  romanMap.put('C' 100);  romanMap.put('D' 500);  romanMap.put('M' 1000);  int res = 0;  for (int i = 0; i < s.length(); i++) {  // if the current value is less than the next value  // subtract current from next and add to res  if (i + 1 < s.length() && romanMap.get(s.charAt(i)) <   romanMap.get(s.charAt(i + 1))) {  res += romanMap.get(s.charAt(i + 1)) -   romanMap.get(s.charAt(i));  // skip the next symbol  i++;  }  else {  // otherwise add the current value to res  res += romanMap.get(s.charAt(i));  }  }  return res;  }  public static void main(String[] args) {  String s = 'IX';  System.out.println(romanToDecimal(s));  } } 
Python
def romanToDecimal(s): romanMap = {'I': 1 'V': 5 'X': 10 'L': 50 'C': 100 'D': 500 'M': 1000} res = 0 i = 0 while i < len(s): # if the current value is less than the next value  # subtract current from next and add to res if i + 1 < len(s) and romanMap[s[i]] < romanMap[s[i + 1]]: res += romanMap[s[i + 1]] - romanMap[s[i]] # skip the next symbol i += 1 else: # otherwise add the current value to res res += romanMap[s[i]] i += 1 return res if __name__ == '__main__': s = 'IX' print(romanToDecimal(s)) 
C#
using System; using System.Collections.Generic; class GfG {  static int romanToDecimal(string s) {    // create a map to store the Roman numeral values  Dictionary<char int> romanMap =   new Dictionary<char int> {  {'I' 1} {'V' 5} {'X' 10} {'L' 50}  {'C' 100} {'D' 500} {'M' 1000}  };  int res = 0;  for (int i = 0; i < s.Length; i++) {    // if the current value is less than the next value   // subtract current from next and add to res  if (i + 1 < s.Length && romanMap[s[i]] < romanMap[s[i + 1]]) {  res += romanMap[s[i + 1]] - romanMap[s[i]];  // skip the next symbol  i++;  }  else {    // otherwise add the current value to res  res += romanMap[s[i]];  }  }  return res;  }  static void Main() {  string s = 'IX';  Console.WriteLine(romanToDecimal(s));  } } 
JavaScript
function romanToDecimal(s) {    // create a map to store the Roman numeral values  const romanMap = {  'I': 1 'V': 5 'X': 10 'L': 50  'C': 100 'D': 500 'M': 1000  };  let res = 0;  for (let i = 0; i < s.length; i++) {  // if the current value is less than the next value   // subtract current from next and add to res  if (i + 1 < s.length && romanMap[s[i]] < romanMap[s[i + 1]]) {  res += romanMap[s[i + 1]] - romanMap[s[i]];  // skip the next symbol  i++;  }  else {  // otherwise add the current value to res  res += romanMap[s[i]];  }  }  return res; } // Driver Code let s = 'IX'; console.log(romanToDecimal(s)); 

الإخراج
9