罗马数字转整数
CSDN“每日一练”(python)题目。
- 题目
- 罗马数字构造规则
- 代码运行效果
- 罗马数字字符输入判定
- 完整代码
练习题目
题目标题是“罗马数字转整数”,而内容却是要求整转罗马数字。我就先做“罗马数字转整数的练习”,后面再做“整数转罗马数字”的练习。
罗马数字构造规则
上图勘误(图片截图于网络):
- “3、表示为5的倍数的字母(V、L、D),不得重复。”我认为应该说成“表示为5的1*10幂次方的字母”更为准确。
- “9不能表示为XIIII”应该是“9不能表示为VIIII”
- 表格中的49是“IL”,“I”和“L”中间跨越了数位“X”,显然不全构造规则。应该是40(XL)+9(IX)=49(XLIX),所以49的罗马数字应该是“XLIX”。详见下面
AI学习搭子“智谱清言”回答
:
代码运行效果
打印整数前面多了四个空格,代码已更正。
输入罗马数字字符合规验证
代码
# coding: utf-8
def isRoman(s):
'''罗马数字判定'''
s = s.strip() #去除罗马数字字符串前后空格。
for i in s: #含七个罗马数字构造字母以外的字符,为非。
if i not in list('IVXLCDM'): #遍历罗马数字字符串
return False
for i in ('I', 'X', 'C', 'M'): #检查可以重复字母是否超过三次。
if i*4 in s: #模10位最多重复三次。
return False
for i in ('V', 'L', 'D'): #不可重复字母。
if i*2 in s: #模5位不可重复。
return False
for i in ('IL','IC', 'ID', 'IM', 'XD', 'XM'): #穷举不可为之“减”构造。
if i in s:
return False
for i in ('VX','VL', 'VC', 'VD', 'VM', 'LC', 'LD', 'LM', 'DM'): #穷举不可为之“减”构造。
if i in s:
return False
for i in ('IIV','IIX', 'XXL', 'XXC', 'CCD', 'DDM'): #穷举不可为之“减”构造(减两小的数)。
if i in s:
return False
return True
s = 'IL', 'MMMIIVII', 'CIIX', 'CIX', 'YXIII', 'CVIII', 'MXLVIII'
for i in s:
print(f'\n\n{"判定罗马数字":_^36}\n\n\n{" ":12}“{i}”:{isRoman(i)}\n\n\n{"The End":_^42}\n')
csdn友友在本文评论中提出了质疑,我重新捋了捋知关于“罗马数字”的知识点,发现我的
i
s
R
o
m
a
n
isRoman
isRoman是有所残缺的(存在没有顾及到的情形的bug
)。
- 如:
把不合规的写法
判断成 T r u e True True,因而我打算抽时间重写 i s R o m a n isRoman isRoman函数。
罗马数字的结构基于七个基本的拉丁字母,每个字母代表一个数值。这些字母和它们对应的数值如下:
- I = 1
- V = 5
- X = 10
- L = 50
- C = 100
- D = 500
- M = 1000
罗马数字通过组合这些基本符号来表示其他数值。组合时,可以采用加法或减法规则:
- 加法规则:当一个或多个相同或更低的值连续出现时,其值相加。例如:
- III = 1 + 1 + 1 = 3
- XXX = 10 + 10 + 10 = 30
- 减法规则:当一个较低值的符号出现在较高值的符号左边时,表示从较高值中减去较低值。例如:
- IV = 5 - 1 = 4
- XL = 50 - 10 = 40
- CM = 1000 - 100 = 900
减法规则仅适用于特定的组合,通常是那些代表 4 4 4和 9 9 9的倍数的组合(如4、9、40、90、400、900)。
- 符号限制:某些符号不能连续出现超过一定的次数:
- I、X 和 C 可以连续出现最多三次。
- V、L 和 D 不能重复。
- M 可以连续出现最多四次,但在实际中很少超过三次。
- 不能连续出现超过一个减法:任何符号都不能连续出现超过一次以表示减法。例如,IXIV(表示 13)和 XCXL(表示 130)是不允许的。
- 不能减去比下一个最小符号大的值:例如,不能有 IXL(表示 40),正确的表示是 XL。
- 不能减去的规则:不能从 V、L 或 D 中减去任何值。不能从 M 中减去任何比 C 小的值。
- 零的表示:罗马数字没有表示零的符号。在需要表示零的情况下,通常使用阿拉伯数字 0。
罗马数字通常用于表示时间(如电影年份)、书籍章节、建筑物年代等。在现代,罗马数字已经不常用于日常计算,被阿拉伯数字所取代,但它们在许多文化和技术领域仍然保持着一定的使用。
罗马数字的书写规范包括一系列规则,以确保数字的正确表示和一致性。以下是一些基本的罗马数字书写规范:
- 符号顺序:罗马数字从左到右书写,从最高位到最低位。
- 加法与减法:在表示数值时,通常先使用减法规则(如果有的话),然后是加法规则。
- 减法限制:减法只能用于以下组合:
- IV(4)
- IX(9)
- XL(40)
- XC(90)
- CD(400)
- CM(900)
- 重复符号:除了一千(M)以外,任何符号都不能连续出现超过三次。例如,“IIII” 是不允许的,应该写成 “IV”。
- 千位分隔:在现代,有时会在罗马数字的千位之间加上点(·)以提高可读性,例如 “M.DCCCXCIX” 表示 1899。
- 小数点:罗马数字不直接表示小数,但有时可以使用下标的方式来表示小数部分,例如 “XIV” 可以表示为 “XIV1” 来表示 14.1。
- 负数:罗马数字没有标准的表示负数的方法。在现代,有时会在数字前面加上一个减号(-)来表示负数,例如 “-XLV” 表示 -45。
- 零:罗马数字没有零的概念。在需要表示零的情况下,通常使用阿拉伯数字 0。
- 大数表示:罗马数字通常不用于表示非常大或非常小的数。对于非常大的数,可以使用在数字上方加上一条横线的方式来表示这个数乘以 1000,但这在现代并不常见。
- 上下文:在某些情况下,罗马数字的使用可能受到特定文化或行业的习惯影响。例如,罗马数字在钟表和日历上的使用可能与一般的书写规范有所不同。
遵循这些规范,可以确保罗马数字的正确书写和阅读。
代码正在编撰中……
python完整代码
(如果从语句注释不能清楚作用,请评论区留言指教和探讨。🤝)
# coding: utf-8
def Roman_to_decimal(s):
'''罗马数字转十进制数字'''
units = [
['M', 1000, 1],
['CM', 900, 2],
['D', 500, 1],
['CD', 400, 2],
['C', 100, 1],
['XC', 90, 2],
['L', 50, 1],
['XL', 40, 2],
['X', 10, 1],
['IX', 9, 2],
['V', 5, 1],
['IV', 4, 2],
['I', 1, 1]
] #罗马数字单位列表。
integer = 0
while s != '': #罗马数字字符串为空线束while循环。
for i, j, n in units: #遍历罗马数字单位列表。
if s[:n] == i:
integer += j #累加单位数数值。
s = s[n:] #字符串切片去除已累加罗马数字字符。
if s == '': #罗马数字字符串为空线束for遍历。
break
return integer
print(f'\n\n\n{"罗马数字转整数":_^35}\n')
Roman = input(f'\n\n{" ":4}输入罗马数字:').strip()
print(f'\n\n\n{" ":4}罗马数字{Roman}转整数是:\
{Roman_to_decimal(Roman)}\n\n\n{"The End":_^42}\n')
我的博文推荐:
- 斐波那契数列(递归实现和for实现)(当前阅读1664)
- 排序数组中查找元素的重复起止位置(当前阅读1200)
- 柱状图中最大矩形(当前阅读1605)
- 电话拨号键盘的字母组合(当前阅读1217)
- 密码强度检测器(当前阅读1669)
- 求列表平衡点(当前阅读1703)
- 字符串统计(当前阅读1903)
- 尼姆游戏(代码优化版)(当前阅读823)
- Hot:尼姆游戏(聪明版首发)(当前阅读3241)
推荐条件
点阅破千
相关文章:
上一篇: 让QQ群昵称色变的神奇代码
下一篇: 罗马数字转换器|罗马数字生成器
![老齐漫画头像](https://img-blog.csdnimg.cn/20210916225739194.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzU3MTU4NDk2,size_16,color_FFFFFF,t_70)
精品文章:
- OPP三大特性:封装中的property
- 通过内置对象理解python'
- 正则表达式
- python中“*”的作用
- Python 完全自学手册
- 海象运算符
- Python中的 `!=`与`is not`不同
- 学习编程的正确方法
来源:老齐教室