罗马数字判定器( bug 修正)

罗马数字百科词条



罗马数字判定器


  在做“罗马数字转整数”的练习时,想到怎样保证输入的罗马数字字符串是合格的罗马数字哩,那不得进行下输入字符串的判定么?因而就有了这个练习。

  1. 代码运行效果
  2. 完整代码
  3. bug 修正2022-1-30

回首页

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博:

推荐条件 点阅破千

相关文章:


上一篇:练习:有趣的二维数组
下一篇:


回首页

老齐漫画头像

精品文章:

来源:老齐教室


CSDN实用技巧博文:


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值