Python 转换介于1到3999之间的罗马数字为十进制数程序

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模块(使用字典)。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程