整数到罗马while循环解释python

2024-09-29 23:27:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图理解程序中的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()而不是{},为什么代码不能工作?(例如,58将导致IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII而不是LVIII。)当在该行上使用断点时,无论有没有sorted,顺序都保持不变。

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


Tags: 代码程序items数字numixsortedroman
3条回答

Python3:

# 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)



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

  1. sorted(numerals.items(), reverse=True)不仅表示排序,还表示反向排序。关键点是reverse=True。因为我们必须首先与最大的罗马帝国相比较。从M到{},而不是从I到{}。在
  2. "The logic says num>=k. 1000,M is also greater than num 58."我想你在这里有误会。对于while num>=k:,它发现小于或等于num,不太大,因此L将是第一个。在

希望这对你有帮助。在

相关问题 更多 >

    热门问题