因此,我在创建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))
答案 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
注意:值和符号必须按降序排列才能使这些循环中的任何一个起作用。