罗马数字与阿拉伯数字

罗马数字的组成规律

         罗马数字是欧洲人在阿拉伯数字传入之前使用的一种数码。其采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。记数的方法:

 

  1. 相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;
  2. 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;
  3. 小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9。
  4. 在一个数的上面画一条横线,表示这个数增值 1,000 倍,如V杠=5000。(以上摘编与百度百科“罗马数字”词条)

问题回答

1.罗马数字是位置计数吗?它的缺点是什么?

        答:《计算机科学概论》第2章《二进制数值与记数系统》中指出:位置记数法是一种表达数字的系统,数位按顺序排列,每个数位有一个位值,数字的值是每个数位和位值的乘积之和。而罗马数字是的本质是字母所对应的数字的和或差。故罗马数字不是位置计数法,但阿拉伯数字是位置计数法。因为十进制阿拉伯数字从右往左,每个数字的位值依次是100,101,102,103...

        而其缺点是书写难度大,大数字的长度特别长,且没有0。

2.把你的8位学号(20121424)转化成罗马数字。

       答:根据组成规律,20221424可表示为XX(杠杠) CCXX(杠)MCDXXIV。

3.用Python写一个罗马数字转化为阿拉伯数字的程序,并验证上面你的学号对不对

       答:由于此程序过于复杂,我目前还不会写,故我从CSDN上抄写了其代码。其链接为:(4条消息) python实现阿拉伯数字和罗马数字的互相转换_Together_CZ的博客-CSDN博客(PS:请自动忽略“4条消息”)

#!usr/bin/env python
#encoding:utf-8
 
'''
__Author__:沂水寒城
功能:阿拉伯数字和罗马数字的互相转换
'''
 
def transform_alabo2_roman_num(one_num):
    '''
    将阿拉伯数字转化为罗马数字
    '''
    num_list=[1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
    str_list=["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"]
    res=''
    for i in range(len(num_list)):
        while one_num>=num_list[i]:
            one_num-=num_list[i]
            res+=str_list[i]
    return res
 
 
def transform_roman_num2_alabo(one_str):
    '''
    将罗马数字转化为阿拉伯数字
    '''
    define_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
    if one_str=='0':
        return 0
    else:
        res=0
        for i in range(0,len(one_str)):
            if i==0 or define_dict[one_str[i]]<=define_dict[one_str[i-1]]:
                res+=define_dict[one_str[i]]
            else:
                res+=define_dict[one_str[i]]-2*define_dict[one_str[i-1]]
        return res
        # #下面这种写法也可以
        # for i in range(len(one_str)):
        #     if i > 0 and define_dict[one_str[i]] > define_dict[one_str[i - 1]]:
        #         res -= define_dict[one_str[i - 1]]
        #         res += define_dict[one_str[i]] - define_dict[one_str[i - 1]]
        #     else:
        #         res += define_dict[one_str[i]]
        # return res
 
 
if __name__ == '__main__':
    print ('**************将罗马数字转化为阿拉伯数字**************')
    one_str_list=['DII','XV','MDCLXVI','XII','VIII','XCIX','XII']
    for one_str in one_str_list:
        print (one_str,'----->',transform_roman_num2_alabo(one_str))
    
    print ('**************将阿拉伯数字转化为罗马数字**************')
    one_num_list=[77,66,55,8,1200,34,65,3,21,99]
    for one_num in one_num_list:
        print (one_num,'----->',transform_alabo2_roman_num(one_num))

        备注:one_str_list=和one_num_list中的罗马数字和阿拉伯数字可以随意更改。整个代码运行后,将直接输出one_str_list=和one_num_list对应的阿拉伯数字和罗马数字。

        该程序无法实现数上面画横线的操作,故无法验证罗马数字20221424用程序得出的罗马数字和问题二中的数字是否一致。

        我相信通过日后的学习与积累,我也一定能写出罗马数字与阿拉伯数字互化的程序。

posted @ 2022-09-13 22:42  烟火-人间  阅读(143)  评论(0编辑  收藏  举报