Написание функции для преобразования заданного целого числа в римскую цифру с использованием программирования на Python

#python #function #loops

#python #функция #циклы

Вопрос:

Я выполняю некоторые упражнения по кодированию и попытался исследовать, как написать функцию для преобразования заданного целого числа в римскую цифру. Ниже приведен код, который я написал:

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, ‘ Я»)]

 def solution(n):
    
    roman = '' #Set the variable roman to empty
    
    while n>0:  #While the entered integer is greater than 0
        for key,value in roman_map: #loop through every key value in the roman numeral map
            while n>=key: #while the entered integer is more than or equal to the key
                roman =value #Take the value of that key and add it to your empty roman numeral set
                n-=key #Deduct the key from the entered integer
                
    return roman
  

Я попытался понять логику, используемую в коде, и понял следующее:

  1. Возьмите целое число 1
  2. Пока 1 больше 0, перебирайте каждую пару ключ-значение в карте римских цифр
  3. Если целое число больше или равно ключу, возьмите значение этого ключа и добавьте его в пустую переменную ‘roman’.

Я потерял понимание последнего шага, из-за которого ключ должен быть затем вычтен из введенного целого числа. Удаляет ли это эту пару ключ-значение с карты после ее записи? Может кто-нибудь, пожалуйста, помочь мне понять эту логику

Ответ №1:

Вы просто добавляете каждый ключ столько раз, сколько необходимо. Вы не изменяете свой список ссылок roman map . Шаг 3 является общим, так что вы можете обрабатывать повторяющиеся буквы в чем-то вроде 1234. Этот внутренний while цикл добавит M , затем C дважды, затем X три раза и, наконец, IV .

Если вы хотите более полно понять код, выполните свою должную осмотрительность: вставьте пару стратегических print инструкций для отслеживания данных и выполнения. Например

 print(key, value, n, roman)
  

должно дать вам хорошее представление о том, что происходит.

Ответ №2:

Последний шаг, n-=key нет, это ничего не удаляет из dict roman_map . Что это делает, так это вычитает из n сумму, для которой римская часть была найдена в только что завершенном цикле.

День, когда целое число равно 1001. Код будет (вкратце) проверять {1000: 'M'} , добавлять M к roman . Теперь он должен вычесть сумму key (1000) из n , оставив 1 , которая в конечном итоге будет обработана позже в цикле for, после чего она будет добавлена I к строке roman .

В целом, каждый раз, когда код находит римскую цифру для добавления, он должен вычесть из целого числа сумму, которую она представляет.