有人可以在这里解释逻辑吗?

时间:2020-07-18 01:33:01

标签: python

因此,我在创建python类以将int转换为罗马数字时进行了一些练习,我的解决方案可以工作,但是要转换所有可能的数字将是一个非常长的代码,因此我在页面上检查了解决方案(以下代码),显然可以,但是我不了解for循环中的逻辑,有人可以解释一下吗?

class py_solution:
    def int_to_Roman(self, num):
        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  num > 0:
            for _ in range(num // val[i]):
                roman_num += syb[i]
                num -= val[i]  
            i += 1
        return roman_num


print(py_solution().int_to_Roman(0))
print(py_solution().int_to_Roman(1400))

2 个答案:

答案 0 :(得分:0)

好吧,首先您需要注意//运算符,这是楼层划分。

对于int_to_Roman(0),由于num不大于0,所以程序不会进入while或for。

在第二种情况下,int_to_Roman(1400),范围为1。因为1400/1000为1。

然后roman_num将为M,num = 400(1400-1000)。 现在i的值是1。 由于num大于0,因此我们再次进入for循环。这次的val [1]是900,因此400 // 900的结果是0,无所事事,转到下一步。

Now i=2 and val[2] is 500, again the range is 0. Next step. 
i=3, val[3] is 400, now the range is 1 (400 // 400). 
roman_num is M + CD and num = 0. 

片刻结束,返回值为MCD。

答案 1 :(得分:0)

您具体不了解什么?尝试注释每一行的内容,例如:

i = 0
while  num > 0:
    for _ in range(num // val[i]): # Loop the number of times current value divides num
        roman_num += syb[i]        # Add the current symbol to the answer
        num -= val[i]              # Subtract current value from number
    i += 1                         # Go to the next value/symbol

这可以简化:

i = 0
while num > 0:
    x = num // val[i]
    num -= val[i]*x
    roman_num += syb[i]*x          # Add x times the current symbol
    i += 1

注意:

num -= val[i]*x   # x = num // val[i]

等效于:

num %= val[i]     # The remainder (modulus)

while循环实际上没有做任何事情,因为对于num的最后一个值,0始终为1,因此您可以循环访问的索引值和符号:

for i in range(len(val)):
    x = num // val[i]
    num %= val[i]
    roman_num += syb[i]*x

注意:

x = num // val[i]
num %= val[i]

等效于:

x, num = divmod(num, val[i])

当您可以直接遍历值和符号时,遍历索引被认为不是很好的Python语言:

for v, s in zip(val, syb):
    x, num = divmod(num, v)
    roman_num += s*x

注意:值和符号必须按降序排列才能使这些循环中的任何一个起作用。