罗马数字转阿拉伯数字

罗马数字转阿拉伯数字

罗马数字时位置记数法吗?

根据《计算机科学概论》可以知道,位置记数法的概念为:

位置记数法(positional notation):一种表达数字的系统,数位按顺序排列,每个数位有一个位值,数字的值是每个数位和位值的乘积之和。

又根据罗马数字转换阿拉伯数字0~3999,关于罗马数字的一些概念:

有两条须注意掌握:
1.基本数字 Ⅰ、X 、C 中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目、都不能超过三个;放在大数的左边只能用一个;
2.不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目、只能使用一个;
相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
小的数字(限于 I、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
正常使用时、连写的数字重复不得超过三次;
在一个数的上面画一条横线、表示这个数扩大 1000 倍。

很明显,罗马数字根本不是位置记数法。比如数字III,是无法根据它的数位和位值的乘积算出来等于3的。

将八位学号转换成罗马数字

从链接中可知,十进制数字的范围是0~3999,但是我的学号是八位,该如何转换?
通过交流,发现:

  • 十进制数字的范围是0~3999,最高四位数
  • 我们的学号是八位数
  • 分割成四位 四位两端,每一段均在这个范围之内

因此,决定将学号分成两个部分,四位四位一转换。
我的学号是20211408,即 2021和1408,其中:

  • 2021转换成罗马数字为MMXXI
  • 1408转换成罗马数字为MCDVIII
    即:我的学号2021 1408 转换为罗马数字为MMXXI MCDVIII

然而,我发现一个算不上是问题的问题:
按照2021 1408进行分段,前者很正确,但是后者并非如此,说到底,我这个学号的含义是2021年入学,在1系4班,8号,本质上,我是8号,而不是1408号,因此我又试着将1408分为1、4和08进行转换

  • 1转换成罗马数字为I
  • 4转换为罗马数字为IV
  • 08转换成罗马数字为VIII
    即:此时我的学号转换为罗马数字是MMXXI I IV VIII

这样,能一眼看出我是于2021年入学,在1系4班,学号为8号

这纯粹是我的个人看法

当然,这样子分法数字转化就很简单了……

用python编写一个罗马数字转化为阿拉伯数字的程序

借鉴了蛮多网上的资料的,比如:
https://www.jb51.net/article/138306.htm
https://www.cnpython.com/qa/566044
https://www.cnblogs.com/qiuyuyu/p/9755608.html

最后上传至码云:
罗马数字转阿拉伯数字
罗马数字转阿拉伯数字(另)

对代码原理尝试进行了理解,首先定义了函数,函数名称随意,意图在于通过函数实现罗马数字向阿拉伯数字的转换,接着定义了字典,根据罗马数字与阿拉伯数字的对应关系进行梳理,然后如果str是0这个字符,那么回到初始值即0;否则的话初始值定为0,进入for循环,当变量i从索引0到索引“str字符长度”的时候,如果i满足等于0或者i变量对应的函数值与i-1的函数值比大小,如果大于,则res叠加一个i的函数,否则i函数-2个i-1的函数,最后return所得res值,返回到输出值。接着就是人机互动的环节:输入罗马数字,根据输入进行上述操作,以阿拉伯数字输出。

posted @ 2021-10-12 21:45  20211408王其  阅读(579)  评论(0编辑  收藏  举报