在Python中把罗马数字转换成整数

小时候,我们都学过如何将罗马数字转换成整数。现在,当我们是程序员时,让我们做一个Python程序,为我们做这件事。

在这篇文章中,我们将学习如何用Python将罗马数字转换成整数。

在Python中把罗马数字转换成整数

在我们跳到实际的代码之前,让我们修改罗马数字转换为整数的规则。这里是用于某些整数的基本符号:

Integer      Roman Numeral
   1               I
   5               V
   10              X
   50              L
   100             C
   500             D
   1000            M

我们知道,我们可以从一串给定的罗马数字中找到一个整数的对应值。但我们这样做时必须遵循一些规则。

  1. 对于一串给定的罗马数字,从左到右移动时,如果符号的值减少或保持不变,那么我们就把它们的整数等价物相加,得到最后的答案是整数。

    XVII
    X - 10
    V - 5
    I - 1
    I - 1
    10 + 5 + 1 + 1 = 17
    

    在上面的例子中,数值从左到右减少。因此,我们将它们全部相加,得到17的整数值。

  2. 对于一串给定的罗马数字,从左到右移动时,如果符号的值增加,那么我们从大的值中减去小的值的整数等价物,得到最后的答案为整数。

    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 语句做如下工作:

  1. 如果当前符号的值大于或等于下一个符号的值,那么当前值将被添加到变量ans
  2. 否则,下一个符号的值将被添加到变量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() 函数将罗马数字转换成整数。