练习:罗马数字转整数

156 篇文章 3 订阅


罗马数字转整数


  CSDN“每日一练”(python)题目。

  1. 题目
  2. 罗马数字构造规则
  3. 代码运行效果
  4. 罗马数字字符输入判定
  5. 完整代码

练习题目

在这里插入图片描述

  题目标题是“罗马数字转整数”,而内容却是要求整转罗马数字。我就先做“罗马数字转整数的练习”,后面再做“整数转罗马数字”的练习。

罗马数字构造规则

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上图勘误(图片截图于网络):
  • “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

  罗马数字通过组合这些基本符号来表示其他数值。组合时,可以采用加法或减法规则:

  1. 加法规则:当一个或多个相同或更低的值连续出现时,其值相加。例如:
    • III = 1 + 1 + 1 = 3
    • XXX = 10 + 10 + 10 = 30
  2. 减法规则:当一个较低值的符号出现在较高值的符号左边时,表示从较高值中减去较低值。例如:
    • IV = 5 - 1 = 4
    • XL = 50 - 10 = 40
    • CM = 1000 - 100 = 900
      减法规则仅适用于特定的组合,通常是那些代表 4 4 4 9 9 9的倍数的组合(如4、9、40、90、400、900)。
  3. 符号限制:某些符号不能连续出现超过一定的次数:
    • I、X 和 C 可以连续出现最多三次。
    • V、L 和 D 不能重复。
    • M 可以连续出现最多四次,但在实际中很少超过三次。
  4. 不能连续出现超过一个减法:任何符号都不能连续出现超过一次以表示减法。例如,IXIV(表示 13)和 XCXL(表示 130)是不允许的。
  5. 不能减去比下一个最小符号大的值:例如,不能有 IXL(表示 40),正确的表示是 XL。
  6. 不能减去的规则:不能从 V、L 或 D 中减去任何值。不能从 M 中减去任何比 C 小的值。
  7. 零的表示:罗马数字没有表示零的符号。在需要表示零的情况下,通常使用阿拉伯数字 0。

  罗马数字通常用于表示时间(如电影年份)、书籍章节、建筑物年代等。在现代,罗马数字已经不常用于日常计算,被阿拉伯数字所取代,但它们在许多文化和技术领域仍然保持着一定的使用。


  • 罗马数字书写规范

  罗马数字的书写规范包括一系列规则,以确保数字的正确表示和一致性。以下是一些基本的罗马数字书写规范:

  1. 符号顺序:罗马数字从左到右书写,从最高位到最低位。
  2. 加法与减法:在表示数值时,通常先使用减法规则(如果有的话),然后是加法规则。
  3. 减法限制:减法只能用于以下组合:
    • IV(4)
    • IX(9)
    • XL(40)
    • XC(90)
    • CD(400)
    • CM(900)
  4. 重复符号:除了一千(M)以外,任何符号都不能连续出现超过三次。例如,“IIII” 是不允许的,应该写成 “IV”。
  5. 千位分隔:在现代,有时会在罗马数字的千位之间加上点(·)以提高可读性,例如 “M.DCCCXCIX” 表示 1899。
  6. 小数点:罗马数字不直接表示小数,但有时可以使用下标的方式来表示小数部分,例如 “XIV” 可以表示为 “XIV1” 来表示 14.1。
  7. 负数:罗马数字没有标准的表示负数的方法。在现代,有时会在数字前面加上一个减号(-)来表示负数,例如 “-XLV” 表示 -45。
  8. :罗马数字没有零的概念。在需要表示零的情况下,通常使用阿拉伯数字 0。
  9. 大数表示:罗马数字通常不用于表示非常大或非常小的数。对于非常大的数,可以使用在数字上方加上一条横线的方式来表示这个数乘以 1000,但这在现代并不常见。
  10. 上下文:在某些情况下,罗马数字的使用可能受到特定文化或行业的习惯影响。例如,罗马数字在钟表和日历上的使用可能与一般的书写规范有所不同。
    遵循这些规范,可以确保罗马数字的正确书写和阅读。

  • 优化isRomsn函数代码(bug修正)


代码正在编撰中……



回首页


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')

回首页

我的博文推荐:

推荐条件 点阅破千

相关文章:


上一篇:让QQ群昵称色变的神奇代码
下一篇:罗马数字转换器|罗马数字生成器


回首页

老齐漫画头像

精品文章:

来源:老齐教室


CSDN实用技巧博文:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦幻精灵_cq

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

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

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

打赏作者

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

抵扣说明:

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

余额充值