整数到罗马数字的转换(python)
Conversion of integers to Roman numerals (python)
我知道有很多关于此主题的类似问题。但是我还有一些疑惑需要弄清楚。
def int_to_roman(input):
if type(input) != type(1):
raise TypeError, "expected integer, got %s" % type(input)
if not 0 < input < 4000:
raise ValueError, "Argument must be between 1 and 3999"
ints = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1)
nums = ('M', 'CM', 'D', 'CD','C', 'XC','L','XL','X','IX','V','IV','I')
result = ""
for i in range(len(ints)):
count = int(input / ints[i])
result += nums[i] * count
input -= ints[i] * count
return result
我不太理解下面的代码:
for i in range(len(ints)):
count = int(input / ints[i])
result += nums[i] * count
input -= ints[i] * count
是否:
for i in range (len(ints)):
表示'1000','900','800'(分别为整数)还是表示13(整数中的13个整数)?
count = int(input / ints[i])
整数 [i] 是什么意思?
谁能解释一下这些代码?如果你能展示例子(比如替换数字并展示它是如何工作的)就更好了
两个列表的名称很糟糕(ints
和 nums
)。
但是,从最高的罗马数字 (nums[0]
= 'M') 开始,循环找出该数字 (ints[0]
= 1000) 的值分为多少次输入值,并将数字多次附加到结果字符串。
然后它从输入中减去刚刚添加到结果 (ints[0] * count
) 的字符串的值,然后移动到下一个罗马数字 (nums[1]
) 以重复该过程余数
两个列表,ints
和nums
长度相同。循环遍历 ints
的长度,这意味着变量 i
可以访问任一列表的相同位置,将一个与另一个匹配。
如果我们单步执行循环,count
被赋予输入的整数值除以 ints
中的第一个数字,即 1000。如果 input
变量是,比方说 10,那么 10/1000 将导致数字 <1,并且在结果上使用 int()
将导致它将 0 分配给 count
。当0乘以nums
中的匹配字符串时,赋值的结果基本为空。然后从 input
中减去相同的数量,在这种情况下保持不变。
最终,当除法的结果是一个>=1的数字时,循环将到达一个点,所以下面的步骤会做一些事情。
假设 int(input / ints[i])
的结果是 3。"X" * 3
的结果是 "XXX"
,它被添加到 result
,input
被减少适当的数量,在本例中为 30。以此类推,直到循环结束。
def romanize(number):
n2rMap = {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'}
roman = ""
for key in n2rMap.keys():
count = int(number / key)
roman += n2rMap[key] * count
number -= key * count
return roman
我知道有很多关于此主题的类似问题。但是我还有一些疑惑需要弄清楚。
def int_to_roman(input):
if type(input) != type(1):
raise TypeError, "expected integer, got %s" % type(input)
if not 0 < input < 4000:
raise ValueError, "Argument must be between 1 and 3999"
ints = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1)
nums = ('M', 'CM', 'D', 'CD','C', 'XC','L','XL','X','IX','V','IV','I')
result = ""
for i in range(len(ints)):
count = int(input / ints[i])
result += nums[i] * count
input -= ints[i] * count
return result
我不太理解下面的代码:
for i in range(len(ints)):
count = int(input / ints[i])
result += nums[i] * count
input -= ints[i] * count
是否:
for i in range (len(ints)):
表示'1000','900','800'(分别为整数)还是表示13(整数中的13个整数)?
count = int(input / ints[i])
整数 [i] 是什么意思?
谁能解释一下这些代码?如果你能展示例子(比如替换数字并展示它是如何工作的)就更好了
两个列表的名称很糟糕(ints
和 nums
)。
但是,从最高的罗马数字 (nums[0]
= 'M') 开始,循环找出该数字 (ints[0]
= 1000) 的值分为多少次输入值,并将数字多次附加到结果字符串。
然后它从输入中减去刚刚添加到结果 (ints[0] * count
) 的字符串的值,然后移动到下一个罗马数字 (nums[1]
) 以重复该过程余数
两个列表,ints
和nums
长度相同。循环遍历 ints
的长度,这意味着变量 i
可以访问任一列表的相同位置,将一个与另一个匹配。
如果我们单步执行循环,count
被赋予输入的整数值除以 ints
中的第一个数字,即 1000。如果 input
变量是,比方说 10,那么 10/1000 将导致数字 <1,并且在结果上使用 int()
将导致它将 0 分配给 count
。当0乘以nums
中的匹配字符串时,赋值的结果基本为空。然后从 input
中减去相同的数量,在这种情况下保持不变。
最终,当除法的结果是一个>=1的数字时,循环将到达一个点,所以下面的步骤会做一些事情。
假设 int(input / ints[i])
的结果是 3。"X" * 3
的结果是 "XXX"
,它被添加到 result
,input
被减少适当的数量,在本例中为 30。以此类推,直到循环结束。
def romanize(number):
n2rMap = {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'}
roman = ""
for key in n2rMap.keys():
count = int(number / key)
roman += n2rMap[key] * count
number -= key * count
return roman