在Python中把罗马数字转换成整数
小时候,我们都学过如何将罗马数字转换成整数。现在,当我们是程序员时,让我们做一个Python程序,为我们做这件事。
在这篇文章中,我们将学习如何用Python将罗马数字转换成整数。
在Python中把罗马数字转换成整数
在我们跳到实际的代码之前,让我们修改罗马数字转换为整数的规则。这里是用于某些整数的基本符号:
Integer Roman Numeral
1 I
5 V
10 X
50 L
100 C
500 D
1000 M
我们知道,我们可以从一串给定的罗马数字中找到一个整数的对应值。但我们这样做时必须遵循一些规则。
-
对于一串给定的罗马数字,从左到右移动时,如果符号的值减少或保持不变,那么我们就把它们的整数等价物相加,得到最后的答案是整数。
XVII X - 10 V - 5 I - 1 I - 1 10 + 5 + 1 + 1 = 17
在上面的例子中,数值从左到右减少。因此,我们将它们全部相加,得到17的整数值。
-
对于一串给定的罗马数字,从左到右移动时,如果符号的值增加,那么我们从大的值中减去小的值的整数等价物,得到最后的答案为整数。
XL X - 10 L - 50 50 - 10 = 40
在上面的例子中,数值从左到右增加。因此,我们将它们相减,得到
40
,作为整数值。
在编写将罗马数字转换为整数的代码时,你需要记住这两条规则。另外,请注意,除了字典之外,我们还可以使用其他一些方法来将罗马数字转换成整数。
让我们逐一来看看。
用Python程序将罗马数字转换成整数
将罗马数字转换成整数的最简单方法是使用if
语句来存储基本的罗马符号。下面是同样的代码。
# function to store the basic roman symbols
def map_symbols(s):
if (s == 'I'):
return 1
if (s == 'V'):
return 5
if (s == 'X'):
return 10
if (s == 'L'):
return 50
if (s == 'C'):
return 100
if (s == 'D'):
return 500
if (s == 'M'):
return 1000
return -1
# function to perform the conversion
def change_roman_to_int(roman):
ans = 0
i = 0
while(i<len(roman)):
x1 = map_symbols(roman[i] )
if(i+1 < len(roman)):
x2 = map_symbols(roman[i+1])
if (x1 >= x2):
ans = ans + x1
i = i + 1
else:
ans = ans + x2 - x1
i = i + 2
else:
ans = ans + x1
i = i + 1
return ans
# driver code
r = input("Enter the roman numeral: ")
print("The integer equivalent is: ")
print(change_roman_to_int(r))
输出:
Enter the roman numeral: MLXVI
The integer equivalent is:
1066
让我们看看这段代码的工作情况。
当我们输入一个罗马字串作为输入时,它被存储在变量r
,然后被传递给函数change_roman_to_int
。我们在这个函数中使用一个while
循环来迭代整个字符串。
此外,当while
循环遍历每个值时,while
循环内的if-else
语句做如下工作:
- 如果当前符号的值大于或等于下一个符号的值,那么当前值将被添加到变量
ans
。 - 否则,下一个符号的值将被添加到变量
ans
,然后从其中减去当前值。
这基本上是这段代码的工作方式。
现在让我们看看另一种方法,我们使用Python字典将罗马数字转换成整数。
使用Python字典将罗马数字转换成Python中的整数
在这里,基本的想法仍然是一样的。唯一改变的是,我们使用字典来存储罗马数字和它们相应的整数值,而不是使用if
语句。
下面是同样的代码。
# function to convert roman numeral into an integer
def change_roman_to_int(roman):
# dictionary to store the roman-integer values
map_symbols = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
ans = 0
for i in range(len(roman)):
if i > 0 and map_symbols[roman[i] ] > map_symbols[roman[i - 1]]:
ans += map_symbols[roman[i] ] - 2 * map_symbols[roman[i - 1]]
else:
ans += map_symbols[roman[i] ]
return ans
# driver code
r = input("Enter the roman numeral: ")
print("The integer equivalent is: ")
print(change_roman_to_int(r))
输出:
Enter the roman numeral: MMMCMLXX
The integer equivalent is:
3970
请注意,你可以使用for
循环或while
循环来迭代输入字符串,因为两者的工作原理相似。
你也可以使用enumerate
函数和一个字典,如下面的代码。
# function to convert roman numeral into an integer
def change_roman_to_int(roman):
# dictionary to store the roman-integer values
map_symbols = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
ans = 0
l = len(roman)
for (i, v) in enumerate(roman):
if i < l-1 and map_symbols[v] < map_symbols[roman[i+1]]:
ans -= map_symbols[v]
else:
ans += map_symbols[v]
return ans
# driver code
r = input("Enter the roman numeral: ")
print("The integer equivalent is: ")
print(change_roman_to_int(r))
输出:
Enter the roman numeral: MCMXCIV
The integer equivalent is:
1994
我们在字典中只添加了7个基本罗马字母符号。如果我们添加更多的自定义符号,我们可以进一步简化代码。
请看下面的代码。
# function to change a roman numeral into an integer
def change_roman_to_int(roman):
custom_symbols = {"IV":-2,"IX":-2, "XL":-20, "XC":-20, "CD":-200, "CM":-200}
map_symbols = {"I":1, "V":5,"X":10, "L":50,"C":100, "D":500,"M":1000}
ans = 0
for i in roman:
ans += map_symbols[i]
for i in range(len(roman) - 1):
merge = str(roman[i] + roman[i + 1])
if merge in custom_symbols:
ans += custom_symbols[merge]
return ans
# driver code
r = input("Enter the roman numeral: ")
print("The integer equivalent is: ")
print(change_roman_to_int(r))
输出:
Enter the roman numeral: MCMXCIV
The integer equivalent is:
1994
你对这段代码的聪明程度不感到惊讶吗?让我们看看这段代码是如何工作的。
在change_roman_to_int
函数里面,我们有两个字典:map_symbols
字典,里面有通常的7个值;custom_symbols
字典,里面有对应于一对罗马符号的负值。
此外,第一个for
循环将所有罗马符号的整数值相加,并将总和存储在变量ans
。下面是这个步骤的样子:
MCMXCIV
M = 1000, C = 100, M = 1000, X = 10, C = 100, I = 1, V = 5
1000 + 100 + 1000 + 10 + 100 + 1 + 5 = 2216
ans = 2216
然后,第二个for
循环遍历罗马字串,每次取两个符号,并将它们作为一个字符串存储在变量merge
。在这个for
循环中的if
语句检查合并后的一对符号是否存在于字典custom_symbols
中。
如果找到的话,相应的负值将被添加到变量ans
。下面是这个步骤的样子:
MC - Not found
CM - Found
ans = 2216 + (-200)
ans = 2016
MX - Not found
XC - Found
ans = 2016 + (-20)
ans = 1996
CI - Not found
IV - Found
ans = 1996 + (-2)
ans = 1994
这基本上就是这段代码的工作原理。
我们已经写了这么久的代码了。现在,让我们坐下来,让Python做这些工作。
使用Python罗马模块将罗马数字转换成Python中的整数
怎么会有人使用 Python 而不知道一定有一个模块有将罗马数字转换为整数的功能呢?那么,这个模块叫做roman
。
要下载这个模块,在cmd上运行以下命令。
pip install roman
输出:
Downloading roman-3.3-py2.py3-none-any.whl (3.9 kB)
Installing collected packages: roman
Successfully installed roman-3.3
一旦模块安装完毕,你必须看到上述信息。
现在,我们可以将这个模块导入我们的代码中,并使用函数fromRoman()
,将任何罗马数字转换为整数。
import roman
x=roman.fromRoman("MCMXCIV")
print(x)
输出:
1994
请参考这个链接,了解更多关于Python的roman
模块。
总结
在这篇文章中,我们看了一些非常有趣的方法,在Python中把罗马数字转换成整数。我们使用了Pythonif
语句和Python字典来实现这一目标。
另外,我们还研究了如何对罗马数字对使用负值,以使代码更容易、更简短。最后,我们看到了Python的roman
模块的使用,它使用fromRoman()
函数将罗马数字转换成整数。