罗马数字判定器
在做“罗马数字转整数”的练习时,想到怎样保证输入的罗马数字字符串是合格的罗马数字哩,那不得进行下输入字符串的判定么?因而就有了这个练习。
python 完整代码
(如果从语句注释不能清楚作用,请评论区留言指教和探讨。🤝)
# 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')
input()
bug 修正(2022-1-30)
1. 加入了罗马数字零 N(n) 的判断。
2. 修正了 ‘iviv’ ‘cdcd’ 等一个罗马数字有两个 V、L、D 的错误。
3. 优化了只能输入大写英文字母的不适用。(看到罗马数字在线转换可以实现大小写输入,用 str.strip().upper() 对输入进行了去除前后空格和转大写操作,对大小写罗马数字英文字母输入,“拯救”了我的处理大写英文字母的代码,让她无惧大小写输入。)
运行效果:
优化 python 代码:
# coding: utf-8
def isRoman(s):
'''罗马数字判定'''
if s == '': #空字符,返回 False 。
return False
if s == 'N': #罗马数字字符零 N(n) ,返回 True 。
return True
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 or Roman.count(i) == 2: #模5位不可重复,且一个罗马数字里不能有两个V、L、D。
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
while True:
Roman0 = input(f'\n\n{"输入罗马数字:":>13}')
Roman = Roman0.strip().upper()
print(f'\n\n{"判定罗马数字":_^36}\n\n\n{" ":12}“{Roman0}”:{isRoman(Roman)}\n\n\n{"The End":_^42}\n')
if Roman0 == '':
break
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')
input()
我的HOT博:
- New:罗马数字转换器|罗马数字生成器(当前阅读1053)
- New:让QQ群昵称色变的神奇代码(当前阅读1252)
- 斐波那契数列(递归实现和for实现)(当前阅读1829)
- 排序数组中查找元素的重复起止位置(当前阅读1204)
- 柱状图中最大矩形(当前阅读1608)
- 电话拨号键盘的字母组合(当前阅读1224)
- 密码强度检测器(当前阅读1670)
- 求列表平衡点(当前阅读1704)
- 字符串统计(当前阅读2067)
- 尼姆游戏(代码优化版)(当前阅读825)
- Hot:尼姆游戏(聪明版首发)(当前阅读3247)
推荐条件
点阅破千
相关文章:
- 练习:罗马数字转整数
- 罗马数字转换器|罗马数字生成器
- 罗马数字转换器(用罗马数字构造元素的值取模实现)
- 罗马数字在线转换,不支持罗马数字N(n)零的转换。
上一篇: 练习:有趣的二维数组
下一篇:
![老齐漫画头像](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`不同
- 学习编程的正确方法
来源:老齐教室