تستكشف هذه المقالة طريقتين في بايثون لتحويل الأعداد الصحيحة إلى أرقام رومانية. سنفحص نهجًا تكرارياً بسيطًا وطريقة أكثر كفاءة باستخدام القسمة الصحيحة.
محتويات الجدول
النهج التكراري للتحويل من عدد صحيح إلى روماني
تستخدم هذه الطريقة قاموسًا يُطابق الأرقام الرومانية بقيمها الصحيحة، وتكرر من خلاله لبناء التمثيل الروماني للعدد. يتم التعامل مع الترميز الطرحي (مثل IV لـ 4) بشكل صريح.
def int_to_roman_iterative(num):
"""يحول عددًا صحيحًا إلى تمثيله بالرقم الروماني باستخدام التكرار.
Args:
num: العدد الصحيح المراد تحويله (يجب أن يكون بين 1 و 3999 شاملاً).
Returns:
التمثيل الروماني للعدد الصحيح، أو None إذا كانت الإدخال غير صالح.
"""
if not 1 <= num = value:
result += symbol
num -= value
return result
# مثال على الاستخدام
print(int_to_roman_iterative(3)) # المخرجات: III
print(int_to_roman_iterative(4)) # المخرجات: IV
print(int_to_roman_iterative(9)) # المخرجات: IX
print(int_to_roman_iterative(58)) # المخرجات: LVIII
print(int_to_roman_iterative(1994)) # المخرجات: MCMXCIV
print(int_to_roman_iterative(4000)) # المخرجات: None
هذا النهج سهل الفهم، ولكنه قد يكون أقل كفاءة للأعداد الكبيرة بسبب عمليات الطرح المتكررة داخل حلقة while
.
التحويل الفعال باستخدام القسمة الصحيحة
تستخدم هذه الطريقة القسمة الصحيحة وعامل المعامل لإدارة الأعداد الصحيحة الكبيرة بكفاءة. إنها تتكرر عبر تعيين الأرقام الرومانية مرة واحدة فقط.
def int_to_roman_division(num):
"""يحول عددًا صحيحًا إلى تمثيله بالرقم الروماني باستخدام القسمة.
Args:
num: العدد الصحيح المراد تحويله (يجب أن يكون بين 1 و 3999 شاملاً).
Returns:
التمثيل الروماني للعدد الصحيح، أو None إذا كانت الإدخال غير صالح.
"""
if not 1 <= num <= 3999:
return None
roman_map = { 1000: 'M', 900: 'CM', 500: 'D', 400: 'CD', 100: 'C', 90: 'XC',
50: 'L', 40: 'XL', 10: 'X', 9: 'IX', 5: 'V', 4: 'IV', 1: 'I'}
result = ""
for value, symbol in roman_map.items():
result += symbol * (num // value)
num %= value
return result
# مثال على الاستخدام
print(int_to_roman_division(3)) # المخرجات: III
print(int_to_roman_division(4)) # المخرجات: IV
print(int_to_roman_division(9)) # المخرجات: IX
print(int_to_roman_division(58)) # المخرجات: LVIII
print(int_to_roman_division(1994)) # المخرجات: MCMXCIV
print(int_to_roman_division(4000)) # المخرجات: None
يقدم نهج القسمة هذا أداءً محسّنًا، خاصةً بالنسبة لأعداد الإدخال الكبيرة، من خلال تقليل العمليات الزائدة.