Python 转换介于1到3999之间的罗马数字为十进制数程序
罗马数字是一种基于前罗马罗马系统的数字记数方法所使用的字符。下面的部分包含了所有主要符号。在这个问题中,我们被给定一个罗马数字的字符串,我们的任务是将罗马数字转换为1到3999的十进制数。
以下是一些示例和解释,以帮助您更好地理解问题。
输入
str = “MXCIX”
输出结果
1099
解释
M是罗马数字1000的表示方式,
XC是罗马数字90的表示方式,
IX是罗马数字9的表示方式。
输入
str = "II"
输出
2
解释
II是罗马数字2的表示方式。
输入
str = “XL”
输出结果
40
解释
XL是罗马数字40的表示方式。
在讲解不同的方法之前,让我们先来看看罗马数字中最基础的符号:
SYMBOL | VALUE |
---|---|
M | 1000 |
CM | 900 |
D | 500 |
CD | 400 |
C | 100 |
XC | 90 |
L | 50 |
XL | 40 |
X | 10 |
IX | 9 |
V | 5 |
IV | 4 |
I | 1 |
方法
根据观察,罗马数字符号按照降序表示数字(例如M首先出现,然后是C等等)。然而,在某些情况下,它也使用减法符号来避免连续重复4个字符(例如CCCC):
- I在X或V之前表示减一。-> 4在罗马数字中表示为IV(比五小一),-> 9在罗马数字中表示为IX(比十小一)
-
X在C或L之前表示减十。-> 40在罗马数字中表示为XL(比五十小十),-> 90在罗马数字中表示为XC(比一百小十)
-
C在M和D之前表示减一百。-> 400在罗马数字中表示为CD(比五百小一百),-> 900在罗马数字中表示为CM(比一千小一百)
为了更好地理解上述方法,让我们看一下下面的代码示例。
示例
Python程序:将罗马数字转换为介于1到3999之间的十进制数。
# Function is created to return a Roman symbol's value.
def value(ch):
val = -1
if(ch=='I'):
val = 1
if(ch=='V'):
val = 5
if(ch=='X'):
val = 10
if(ch=='L'):
val = 50
if(ch=='C'):
val = 100
if(ch=='D'):
val = 500
if(ch=='M'):
val = 1000
return val
def convertRomanToDecimal(str):
decVal = 0
i = 0
n = len(str) # store the size of the string
while (i < n):
# store the numeric value of roman value str[i]
current = value(str[i])
# Check if i+1 charchter exists or not
if (i + 1 < n):
# store the numeric value of roman value str[i+1]
next = value(str[ i + 1 ])
# Check which value is greater current or next
if (current >= next):
# If current >= next add current
# value to the variable decVal
decVal = decVal + current
# Increment the index of the string to point to the next char
i = i + 1
else:
# If current<next add difference of next to current to the variable decVal
decVal = decVal + next - current
# Increment the index of the string to point to the next char
i = i + 2
else:
decVal = decVal + current
# Increment the index of the string to point to the next char
i = i + 1
return decVal
print("The decimal Numeral form of the Roman Numeral is"),
print(convertRomanToDecimal("MXCIX"))
输出
The decimal Numeral form of the Roman Numeral is
1099
时间和空间复杂度
上述代码的时间复杂度为O(N),其中N为字符串的大小。由于代码中没有使用额外的空间,因此上述代码的空间复杂度为O(1)。
方法2
在这种方法中,我们直接使用内置模块Roman将罗马数字转换为十进制。只需使用pip安装该Roman模块即可。
pip install roman
成功安装roman模块后,可以使用fromRoman()方法将罗马数字转换为十进制数字。
它接收一个罗马值作为参数,并输出一个十进制数字。
示例
下面是一个Python程序,实现了上述方法来将罗马数字转换为十进制数字。
import roman
egFirst = roman.fromRoman("MXCIX")
egSecond = roman.fromRoman("II")
egThird = roman.fromRoman("XL")
print("Roman to Decimal conversions are:")
print(egFirst)
print(egSecond)
print(egThird)
输出
Roman to Decimal conversions are:
1099
2
40
方法3
这里使用了 ‘re’ 模块。此方法的思想很简单,我们使用了 Python 的字典函数,将罗马数字与对应的十进制值进行关联。此程序接受一个罗马数字作为输入,并将其转换为对应的十进制值。
示例
# Python Program to convert Roman Numerals to Decimal
import re
# Given string of Roman value
strRoman = 'MXCIX'
# putting Roman numerals and their associated values in a dictionary
romanValue = {'M':1000, 'X':10, 'L':50, 'V':5, 'C':100, 'D':500, 'I':1}
# Creating the variable decValue and assign zero to it
decValue = 0
n = len(strRoman)
# Adding each value from the Roman Numeral string through a loop to the decValue variable
for i in range(n):
if i > 0 and romanValue[strRoman[i]] >romanValue[strRoman[i-1]]:
decValue += romanValue[strRoman[i]] - 2 * romanValue[strRoman[i-1]]
else:
decValue += romanValue[strRoman[i]]
# Printing the Roman numeral in decimal form
print("The decimal Numeral form of the Roman Numeral", strRoman, "is")
print(decValue)
输出
The decimal Numeral form of the Roman Numeral MXCIX is
1099
结论
在本教程中,我们实现了一个Python程序,将罗马数字转换为介于1到3999之间的十进制数。我们实现了三种方法。第一种是使用普通函数,第二种是使用罗马模块,第三种是使用re模块(使用字典)。