罗马数字与阿拉伯数字
罗马数字的组成规律
罗马数字是欧洲人在阿拉伯数字传入之前使用的一种数码。其采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。记数的方法:
-
相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;
-
小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;
-
小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9。
-
在一个数的上面画一条横线,表示这个数增值 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用程序得出的罗马数字和问题二中的数字是否一致。
我相信通过日后的学习与积累,我也一定能写出罗马数字与阿拉伯数字互化的程序。