练习题——阿拉伯数字转化为罗马数字

题目

罗马数字来源于古罗马编码系统。它们是基于字母表的特定字母的组合,所表示的数等于这些数字相加(或者是相减)得到的数。前十位的罗马数字是:
I,II,III,IV,V,VI,VII,VIII,IX和X。
罗马记数系统不是直接的十进制为基础,它没有零。罗马数字是根据这七个符号的组合:
符号值
1  (unus)
5  (quinque)
10  (decem)
50  (quinquaginta)
100  (centum)
500  (quingenti)
1 , 000  (mille)
更多额外的关于罗马数字的信息可以参考维基百科的文章.
在这个任务里,你应该返回给出指定的整数值的范围从 1 3999 的罗马数字。
输入: 一个整数 ( int ).
输出: 一个字符串形式的罗马数字 ( str ).
前提:  0  < number <  4000

测试数据

6
76
499
3888

目标结果

VI
LXXVI
CDXCIX
MMMDCCCLXXXVIII

解题思路

将数字从大到小拆分,需把握规律,依次将结果保存到列表中,最后打印出来。

脚本1

def checkio(num):
    roman = [['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'],
             ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'],
             ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'],
             ['', 'M', 'MM', 'MMM']]
    result = []
    result.append(roman[3][ num / 1000 % 10 ])
    result.append(roman[2][ num / 100 % 10 ])
    result.append(roman[1][ num / 10 % 10 ])
    result.append(roman[0][ num % 10 ])
    return ''.join(result)

text = '''6
76
499
3888'''

for line in text.split('\n'):
    print checkio(int(line))

脚本2

def operate(data, divisor, str1, str2, str3):
    result = ''
    temp = data // divisor
    if temp:
        if temp >= 5:
            if temp == 9:
                result = str1 + str3
                temp -= 9
            else:
                result = str2
                temp -= 5
        if temp:
            if temp == 4:
                result += str1 + str2
            else:
                result += str1 * temp
        return result
 
def checkio(data):
    result = []
    temp = data // 1000
    if temp:
        result.append('M' * temp)
        data %= 1000
    temp = operate(data, 100, 'C', 'D', 'M')
    if temp:
        result.append(temp)
        data %= 100
    temp = operate(data, 10, 'X', 'L', 'C')
    if temp:
        result.append(temp)
        data %= 10
    temp = operate(data, 1, 'I', 'V', 'X')
    if temp:
        result.append(temp)
    return ''.join(result)

text = '''6
76
499
3888'''

for line in text.split('\n'):
    print checkio(int(line))

 

转载于:https://www.cnblogs.com/yestreenstars/p/5485178.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值