在 Python 中将罗马数字转换为整数
上学时我们都学会了如何将罗马数字转换为整数。 现在,当我们是程序员时,让我们编写一个 Python 程序来为我们做这件事。
在本文中,我们将学习如何使用 Python 将罗马数字转换为整数。
在 Python 中将罗马数字转换为整数
在我们跳到实际代码之前,让我们修改一下将罗马数字转换为整数的规则。 以下是用于某些整数的基本符号:
Integer Roman Numeral
1 I
5 V
10 X
50 L
100 C
500 D
1000 M
我们知道我们可以从给定的一串罗马数字中找到一个整数对应的值。 但是我们这样做时必须遵守一些规则。
- 对于给定的一串罗马数字,从左向右移动时,如果符号的值减小或保持不变,则我们将它们的等价整数相加以获得整数的最终答案。 ```bash XVII
X - 10 V - 5 I - 1 I - 1
10 + 5 + 1 + 1 = 17
在上面的示例中,值从左到右递减。 因此,我们将它们全部相加并得到 17 作为整数值。
1. 对于给定的一串罗马数字,从左向右移动时,如果符号的值增加,则我们用较大的值减去较小值的整数等值,得到最终答案的整数。
```bash
XL
X - 10
L - 50
50 - 10 = 40
在上面的示例中,值从左到右增加。 所以,我们减去它们得到 40 作为整数值。
在编写将罗马数字转换为整数的代码时,我们需要记住这两个规则。 另外请注意,除了字典之外,我们还可以使用其他几种方法将罗马数字转换为整数。
让我们一一来看。
在 Python 中将罗马数字转换为整数的 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 函数中,我们有两个字典:具有通常 7 个值的 map_symbols 字典和具有对应于一对罗马符号的负值的 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 Roman 模块将罗马数字转换为整数
怎么会有人使用 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 中将罗马数字转换为整数。 我们使用 Python if 语句和 Python 字典来实现这一点。
此外,我们研究了如何使用罗马对的负值来使代码更简单和更短。 最后,我们看到了 Python 的 roman 模块的使用,它使用 fromRoman() 函数将罗马数字转换为整数。
相关文章
Django 中的 Slug
发布时间:2023/05/04 浏览次数:173 分类:Python
-
本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。
在 Django 中按降序过滤查询集中的项目
发布时间:2023/05/04 浏览次数:157 分类:Python
-
在这个讲解中,学习如何借助 Django 中的 order_by() 方法按降序过滤出查询集中的项目。
Django ALLOWED_HOSTS 介绍
发布时间:2023/05/04 浏览次数:181 分类:Python
-
本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。
Django 中的 Select_related 方法
发布时间:2023/05/04 浏览次数:129 分类:Python
-
本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。
使用 Post 请求将数据发送到 Django 服务器
发布时间:2023/05/04 浏览次数:159 分类:Python
-
在这篇关于Django的讲解中,我们简要介绍了post和get请求以及如何在Django中用post实现CSRF token。
Django 返回 JSON
发布时间:2023/05/04 浏览次数:106 分类:Python
-
在与我们的讨论中,我们简要介绍了 JSON 格式,并讨论了如何借助 Django 中的 JsonResponse 类将数据返回为 JSON 格式。
在 Django 中创建对象
发布时间:2023/05/04 浏览次数:59 分类:Python
-
本文的目的是解释什么是模型以及如何使用 create() 方法创建对象,并了解如何在 Django 中使用 save() 方法。
在 Django 中为多项选择创建字段
发布时间:2023/05/04 浏览次数:75 分类:Python
-
在本文中,我们将着眼于为多项选择创建一个字段,并向您展示如何允许用户在 Django 中进行多项选择。