鱼C论坛

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

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

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

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

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

x
本帖最后由 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 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目、只能使用一个;

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

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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> 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
# 划线那条规则明显是针对大数的,那我们这里默认输入 < 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[0]+j[1]+j[2])  # 批量替换
            result = roman[int(s[i])].translate(table) +result
        
    # 罗马数字转阿拉伯数字
    elif set(s).issubset({'I','V','X','L','C','D','M'}):
        result = 0
        q = [roman[i] for i in s]
        for k in range(len(q)):   
            if q[k]>= max(q[k:]):  # 大权重数左边的小权重数是负数
                result += q[k]
            else:
                result -= q[k]
    # 不属于前面两种
    else:
        print("not pure Roman numerals or Arabic numerals")
    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 | 显示全部楼层
symbol = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000}

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


print(fun57("III"))
print(fun57("VII"))
print(fun57("IV"))
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 | 显示全部楼层
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[number]
        else:
            last_word = "I"
            result = 0
            for each in list(reversed(number)):
                if symbol[each] >= symbol[last_word]:
                    result += symbol[each]
                else:
                    result -= symbol[each]
                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"]))
想知道小甲鱼最近在做啥?请访问 -> 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, 2025-1-15 21:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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