鱼C论坛

 找回密码
 立即注册
查看: 3422|回复: 19

[技术交流] Python: 每日一题 57

[复制链接]
发表于 2017-6-2 16:13:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 ooxx7788 于 2017-6-3 11:58 编辑

本题简单的说,就是罗马数字与阿拉伯数字转换。

首先给出罗马数字对应的阿拉伯数字表。
  1. Symbol    Value
  2. I          1
  3. V          5
  4. X          10
  5. L          50
  6. C          100
  7. D          500
  8. M          1,000
复制代码


1、相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
2、小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
3、小的数字(限于 I、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
4、正常使用时、连写的数字重复不得超过三次;
5、在一个数的上面画一条横线、表示这个数扩大 1000 倍。(本条我们就不考虑了)

有两条须注意掌握:
基本数字 Ⅰ、X 、C 中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目、都不能超过三个;放在大数的左边只能用一个;
不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目、只能使用一个;

还有更多不理解的,那么就百度吧。

游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-6-3 21:29:26 | 显示全部楼层
看一下啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-5 10:57:47 | 显示全部楼层
666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-19 20:29:18 | 显示全部楼层
看起来罗马数字的表示只有1和5,后面数量级变化也只是字母变化
也就是说我只要能表示出 0~9,把加和减分清楚就行了

正好前面练习学到了批量替换,str.maketrans -> translate
  1. # 划线那条规则明显是针对大数的,那我们这里默认输入 < 4000

  2. roman = {'I':1,'II':2, 'III':3, 'IV':4, 'V':5, 'VI':6, 'VII':7, 'VIII':8, 'IX':9, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000, 50: 'L', 100: 'C', 5: 'V', \
  3.          1000: 'M', 500: 'D', 10: 'X',1: 'I', 2: 'II', 3: 'III', 4: 'IV', 5: 'V', 6: 'VI', 7: 'VII', 8: 'VIII', 9: 'IX',0: ''}
  4. p = [('I','V','X'),('X','L','C'),('C','D','M'),('M','m','p')]

  5. # 每一位数单独表示(0-9十种可能),然后按权重替换符号,9的情况特殊,已经用到进位的符号了
  6. def exchange(s):
  7.     """exchange(str) ->str, 阿拉伯数字与罗马数字转换显示"""
  8.     result = ''
  9.     # 阿拉伯转罗马数字
  10.     if s.isdigit():
  11.         for i,j in zip(range(len(s)-1,-1,-1),p):
  12.             table = str.maketrans("IVX",j[0]+j[1]+j[2])  # 批量替换
  13.             result = roman[int(s[i])].translate(table) +result
  14.         
  15.     # 罗马数字转阿拉伯数字
  16.     elif set(s).issubset({'I','V','X','L','C','D','M'}):
  17.         result = 0
  18.         q = [roman[i] for i in s]
  19.         for k in range(len(q)):   
  20.             if q[k]>= max(q[k:]):  # 大权重数左边的小权重数是负数
  21.                 result += q[k]
  22.             else:
  23.                 result -= q[k]
  24.     # 不属于前面两种
  25.     else:
  26.         print("not pure Roman numerals or Arabic numerals")
  27.     return str(result)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-20 19:37:51 | 显示全部楼层
答案不是只提供了阿拉伯转罗马数字吗?题目的意思只要求这个?我还写多了
答案的递归很溜啊,vals取的值正好把麻烦的9和4解决了,很巧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-13 23:05:50 | 显示全部楼层
看答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-13 23:06:51 | 显示全部楼层
重要是不会,没有想通那些逻辑判断语句
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-4 17:33:40 | 显示全部楼层
学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-11 09:46:16 | 显示全部楼层
  1. symbol = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000}

  2. def fun57(str1):
  3.     sum1 = symbol[str1[0]]
  4.     for each in range(len(str1) - 1):
  5.         if len(str1) >= 4:
  6.             if str1[each] == str1[each + 1] == str1[each + 2]:
  7.                 return -1
  8.         if symbol[str1[each]] == symbol[str1[each + 1]] or symbol[str1[each]] > symbol[str1[each + 1]]:
  9.             sum1 += symbol[str1[each + 1]]
  10.         elif symbol[str1[each]] < symbol[str1[each + 1]]:
  11.             sum1 += symbol[str1[each + 1]] - 2 * symbol[str1[each]]
  12.     return sum1


  13. print(fun57("III"))
  14. print(fun57("VII"))
  15. print(fun57("IV"))
  16. print(fun57("IIIVVVV"))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-8 14:13:19 | 显示全部楼层
看答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-8 18:42:05 | 显示全部楼层
观摩
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-20 11:43:48 | 显示全部楼层
看看答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-13 12:24:30 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-15 02:52:58 | 显示全部楼层

看看答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-12 12:06:47 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-29 18:35:04 | 显示全部楼层
学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 20:06:59 | 显示全部楼层
  1. symbol = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
  2. dic = list(zip(('M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'),
  3.                (1000, 900, 500,  400, 100,   90,  50,   40,  10,    9,   5,    4,   1)))


  4. def exchange(number):
  5.     if isinstance(number, int):
  6.         # 阿拉伯数字转罗马数字
  7.         if number > 0:
  8.             result = ""
  9.             for c, v in dic:
  10.                 while v <= number:
  11.                     result += c
  12.                     number -= v
  13.             return result
  14.         else:
  15.             return "您所输入的阿拉伯数字为负数,无法转换!"

  16.     elif isinstance(number, str):
  17.         # 罗马数字转阿拉伯数字
  18.         if len(number) == 1:
  19.             return symbol[number]
  20.         else:
  21.             last_word = "I"
  22.             result = 0
  23.             for each in list(reversed(number)):
  24.                 if symbol[each] >= symbol[last_word]:
  25.                     result += symbol[each]
  26.                 else:
  27.                     result -= symbol[each]
  28.                 last_word = each
  29.             if number == exchange(result):
  30.                 return result
  31.             else:
  32.                 return "您所输入的罗马数字不准确,无法转换!"
  33.     else:
  34.         return "您所输入的参数并不是阿拉伯数字或罗马数字!"


  35. # 正确的测试用例
  36. print(exchange(398))
  37. print(exchange("MMX"))
  38. # 错误的测试用例
  39. print(exchange(-5))
  40. print(exchange("MCMDCDCXCX"))
  41. print(exchange([-5, "MCMDCDCXCX"]))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-30 13:57:15 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-4 20:47:06 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-13 21:14:01 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 19:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表