В этой статье рассматриваются два метода Python для преобразования целых чисел в римские цифры. Мы изучим простой итеративный подход и более эффективный метод, использующий целочисленное деление.
Содержание
- Итеративный подход к преобразованию целых чисел в римские
- Эффективное преобразование с использованием целочисленного деления
Итеративный подход к преобразованию целых чисел в римские
Этот метод использует словарь, сопоставляющий римские цифры их целочисленным значениям, и итерируется по нему для построения римского представления числа. Вычитательная нотация (например, 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
Этот подход, основанный на делении, обеспечивает улучшенную производительность, особенно для больших входных чисел, за счет минимизации избыточных операций.