【问题标题】:Stuck at converting integers into romans坚持将整数转换为罗马数字
【发布时间】:2020-05-11 02:11:33
【问题描述】:

我正在尝试使用 for 循环将整数转换为罗马数字。我启动了代码,但我目前被困在这里,我不知道该怎么办(一直出错)。如果有人对如何继续此代码有任何想法,我们将不胜感激。

roman_digits = {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"}

empty = ""
rand_num = 153

for nums, alpha in roman_digits.items():
    if rand_num <= nums:
        empty += alpha
        rand_num -= nums

print(empty)

此代码无效

【问题讨论】:

  • 我在任何地方都看不到您会在此代码中获得显式异常。尽管从逻辑上讲,153 小于 1000,尽管罗马数字表示为 CLIII,但没有您的代码将插入的 M
  • dict 不是 Python 中的有序集合。你确定这个算法正在按照你期望的顺序进行吗?
  • 是的,在用户输入不超过 1000 之前它应该可以正常工作
  • @Two-BitAlchemist,因为 python 3.7 dict 是按插入顺序排序的。
  • 当我在代码中添加“rand_num -= nums”时,我得到了荒谬的结果

标签: python python-3.x dictionary integer roman-numerals


【解决方案1】:

您的算法需要在某个时候更改输入数字的值。例如,像1053 这样的输入,在第一次迭代中你会发现M。此时,您不再对1000 的地方感兴趣——你需要剩下的——53。因此,您可以将M 添加到您的输出中并继续寻找53。然后你找到L 并继续寻找3。这样的事情可能会让它朝着好的方向发展:

def rn(rand_num):
    empty = ""

    while rand_num > 0:
        for nums, alpha in roman_digits.items():
            if rand_num >= nums:
                empty += alpha
                rand_num -= nums  # change rand_nums
                break

    return empty

【讨论】:

  • 现在我明白了,谢谢你的帮助。非常感谢
【解决方案2】:

我修改了我找到的代码 HERE 使其在其类之外工作。逻辑在网站上都有解释。

rand_num = 153

val = [
    1000, 900, 500, 400,
    100, 90, 50, 40,
    10, 9, 5, 4,
    1
    ]
syb = [
    "M", "CM", "D", "CD",
    "C", "XC", "L", "XL",
    "X", "IX", "V", "IV",
    "I"
    ]
roman_num = ''
i = 0
while  rand_num > 0:
    for _ in range(rand_num // val[i]):
        roman_num += syb[i]
        rand_num -= val[i]
    i += 1
print(roman_num)

【讨论】:

    猜你喜欢
    • 2019-01-09
    • 2011-10-25
    • 2012-10-09
    • 1970-01-01
    • 2021-12-15
    • 2014-10-19
    • 2014-03-04
    相关资源
    最近更新 更多