ooxx7788 发表于 2017-6-2 16:13:13

Python: 每日一题 57

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

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

首先给出罗马数字对应的阿拉伯数字表。
Symbol    Value
I          1
V          5
X          10
L          50
C          100
D          500
M          1,000

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

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

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

**** Hidden Message *****

9875 发表于 2017-6-3 21:29:26

看一下啊

badaoqingchen 发表于 2017-6-5 10:57:47

666666666

solomonxian 发表于 2017-7-19 20:29:18

看起来罗马数字的表示只有1和5,后面数量级变化也只是字母变化
也就是说我只要能表示出 0~9,把加和减分清楚就行了

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

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', \
         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: ''}
p = [('I','V','X'),('X','L','C'),('C','D','M'),('M','m','p')]

# 每一位数单独表示(0-9十种可能),然后按权重替换符号,9的情况特殊,已经用到进位的符号了
def exchange(s):
    """exchange(str) ->str, 阿拉伯数字与罗马数字转换显示"""
    result = ''
    # 阿拉伯转罗马数字
    if s.isdigit():
      for i,j in zip(range(len(s)-1,-1,-1),p):
            table = str.maketrans("IVX",j+j+j)# 批量替换
            result = roman)].translate(table) +result
      
    # 罗马数字转阿拉伯数字
    elif set(s).issubset({'I','V','X','L','C','D','M'}):
      result = 0
      q = for i in s]
      for k in range(len(q)):   
            if q>= max(q):# 大权重数左边的小权重数是负数
                result += q
            else:
                result -= q
    # 不属于前面两种
    else:
      print("not pure Roman numerals or Arabic numerals")
    return str(result)

solomonxian 发表于 2017-7-20 19:37:51

答案不是只提供了阿拉伯转罗马数字吗?题目的意思只要求这个?我还写多了{:10_258:}
答案的递归很溜啊,vals取的值正好把麻烦的9和4解决了,很巧

新手潘包邮 发表于 2018-4-13 23:05:50

看答案

新手潘包邮 发表于 2018-4-13 23:06:51

重要是不会,没有想通那些逻辑判断语句

jdzzj 发表于 2018-7-4 17:33:40

学习一下

咕咕鸡鸽鸽 发表于 2019-1-11 09:46:16

symbol = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000}

def fun57(str1):
    sum1 = symbol]
    for each in range(len(str1) - 1):
      if len(str1) >= 4:
            if str1 == str1 == str1:
                return -1
      if symbol] == symbol] or symbol] > symbol]:
            sum1 += symbol]
      elif symbol] < symbol]:
            sum1 += symbol] - 2 * symbol]
    return sum1


print(fun57("III"))
print(fun57("VII"))
print(fun57("IV"))
print(fun57("IIIVVVV"))

jiazhiyu 发表于 2019-3-8 14:13:19

看答案

Will_M 发表于 2019-3-8 18:42:05

观摩

pan_back 发表于 2019-9-20 11:43:48

看看答案

holiday_python 发表于 2020-6-13 12:24:30

学习

junsitu9159 发表于 2020-6-15 02:52:58


看看答案

19971023 发表于 2020-7-12 12:06:47

1

小陨aoq 发表于 2020-7-29 18:35:04

学习一下

小陨aoq 发表于 2020-7-29 20:06:59

symbol = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
dic = list(zip(('M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'),
               (1000, 900, 500,400, 100,   90,50,   40,10,    9,   5,    4,   1)))


def exchange(number):
    if isinstance(number, int):
      # 阿拉伯数字转罗马数字
      if number > 0:
            result = ""
            for c, v in dic:
                while v <= number:
                  result += c
                  number -= v
            return result
      else:
            return "您所输入的阿拉伯数字为负数,无法转换!"

    elif isinstance(number, str):
      # 罗马数字转阿拉伯数字
      if len(number) == 1:
            return symbol
      else:
            last_word = "I"
            result = 0
            for each in list(reversed(number)):
                if symbol >= symbol:
                  result += symbol
                else:
                  result -= symbol
                last_word = each
            if number == exchange(result):
                return result
            else:
                return "您所输入的罗马数字不准确,无法转换!"
    else:
      return "您所输入的参数并不是阿拉伯数字或罗马数字!"


# 正确的测试用例
print(exchange(398))
print(exchange("MMX"))
# 错误的测试用例
print(exchange(-5))
print(exchange("MCMDCDCXCX"))
print(exchange([-5, "MCMDCDCXCX"]))

夶夶 发表于 2020-7-30 13:57:15

{:5_108:}

nononoyes 发表于 2020-10-4 20:47:06

666

wwwwwise 发表于 2021-5-13 21:14:01

1
页: [1]
查看完整版本: Python: 每日一题 57