整数,罗马时循环解释-Python

时间:2019-03-30 02:43:43

标签: python loops data-conversion roman-numerals

我试图理解程序中的while循环和sorted调用,以将数字转换为下面的罗马数字。

numerals = { 1 : "I", 4 : "IV", 5 : "V", 9 : "IX", 10 : "X", 40 : "XL",
             50 : "L", 90 : "XC", 100 : "C", 400 : "CD", 500 : "D", 900 : "CM", 1000 : "M" }

num = 58  # LVIII

roman = ''

for k, v in sorted(numerals.items(), reverse=True):
    while num >= k:
        roman += v
        num -= k

print(roman)

问题: 1)如果使用numerals.items()而不是sorted(numerals.items(), reverse=True),为什么代码不起作用? (例如,58将导致IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII而不是LVIII。)在该行上使用断点时,无论有无sorted,顺序似乎都保持不变。

2)第一个罗马数字为L。为什么?调试时,我注意到它从1000开始递减计数。当达到50时,我看到了roman == 'L'。该代码测试num >= k是否。 1000(M)也大于58。为什么条件num >= k导致L是第一位数字?

3 个答案:

答案 0 :(得分:2)

如果没有sorted,则循环将从1, 'I'开始。然后,它将被尽可能多地使用。在这种情况下,这将导致58 I秒。 (然后继续到4, 'IV'5, 'V'等上,但是num将为0。)对于sorted,循环从1000, 'M'开始,然后900, 'CM'等。(排序在调试器中不可见的原因是sorted returns a new list。)当到达50, 'L'时,while循环将测试58 >= 50是否(您得到了您观察到的顺序错误),这是正确的。然后将num设置为8,将roman设置为'L'。然后继续循环以获取剩余的数字。

答案 1 :(得分:0)

  1. sorted(numerals.items(), reverse=True)不仅意味着已排序,而且还意味着反向排序。关键点是reverse=True。因为我们必须先比较最大的罗马书。从MI,而不是从IM
  2. "The logic says num>=k. 1000,M is also greater than num 58."我认为您在这里有误会。对于while num>=k:,它发现小于或等于num,但不大,因此L将是第一个。

希望对您有帮助。

答案 2 :(得分:-1)

# num=58# answer> LVIII


num = 58
numerals = { 1 : "I", 4 : "IV", 5 : "V", 9 : "IX", 10 : "X", 40 : "XL",
        50 : "L", 90 : "XC", 100 : "C", 400 : "CD", 500 : "D", 900 : "CM", 1000 : "M" }

roman=''
# reserve numerals
for k, v in sorted(numerals.items(), reverse=True):
    while num>=k:
        roman=roman+v
        num = num - k

print(roman)