#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 больше 0, перебирайте каждую пару ключ-значение в карте римских цифр
- Если целое число больше или равно ключу, возьмите значение этого ключа и добавьте его в пустую переменную ‘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
.
В целом, каждый раз, когда код находит римскую цифру для добавления, он должен вычесть из целого числа сумму, которую она представляет.