前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何获得一个 iPhone X 一样炫酷的罗马计数法出生年份

如何获得一个 iPhone X 一样炫酷的罗马计数法出生年份

作者头像
江米小枣
发布2020-06-15 15:15:55
7150
发布2020-06-15 15:15:55
举报
文章被收录于专栏:云前端

人们十年如一日(不是说杜X斯的广告)的又迎来了一年一度的苹果发布会,作为史上被提前爆料最多的一届,还是在产品的命名上给了人们一些惊喜或是纳闷儿之处 --- 传说中的7s直接变成了8,而iphone9和windows9的贴吧吧主据说抱头痛哭晕在了厕所;最重量级的新手机被命名为了 iPhone X

需要注意的是,不要再像Windows XP那样读成不雅的"瘟□□"了,正确的读音是 “爱凤十” (pronounced iPhone Ten)

那么问题来了,为什么用 X 表示 10 呢?其实大家日常中也能经常见到的是,手表钟表老怀表上,就是这么表示数字的,其正式的称呼是 --- “罗马计数法”

【西玛表】

【罗马表】

视频内容

计数法的渊源

计数法就是记录或标志数目的方法,主要指数字符号的表现形态和记数工具的使用

除了当今通行的阿拉伯数字十进制计数法,历史上主要使用的计数法还有:

  • 巴比伦记数法:巴比伦地区用泥板铭刻来记数,约始于公元前三四千年。记数时采用60进位值制,依靠数码符号的依次排列相加表示数目
  • 古埃及记数法:古埃及最早的数码是发现于石刻上的象形文符号,它使用十进位非位值制方法记数,每一个较高的单位用一个特殊符号表示。记数时也是依次重复排列这些符号
  • 中国古代记数法:中国最早的记数体系见于甲骨文,约形成于公元前16~前11世纪。主要用于占卜祭祀。它是十进位非位值制数系,独立的符号共发现13个。记数时采用一种特别的乘法组合原则,将十、百、千、万作为单位词,对十以上的数目还多用合文并写
  • 古希腊记数法:古希腊最早的数码发现于克里特岛是公元前1500年左右泥板上使用的象形文字记数法,记数靠重复排列
  • 中美洲地区古代记数法:中美洲地区的阿兹台克人和玛雅人在公元初年时记数都用20进位制记数法,但前者是非位值制,而后者则是严格的位值制,主要用于记载编年史
  • 古印度记数法:古印度在公元前2500年左右出现一种称为哈拉巴数码的铭文记数法。印度数码约在公元 9世纪传入阿拉伯地区,后来又在欧洲和世界各地普及,逐步发展成为现在通用的阿拉伯数字形式
  • 苏州码子,也叫草码,花码、番仔码、商码,是中国早期民间的“商业数字”。它脱胎于中国文化历史上的算筹,也是唯一还在被使用的算筹系统

罗马计数法的常见用途

  • 公共纪念建筑物
  • 钟表
  • 日历
  • 影视作品制作年份
  • 英文、法文等使用拉丁字母的语言所写的书籍、文件的章节编号(多用大写字母),例如:
    • Chapter XXIV(第二十四章)
    • Section VI.3(第六段之第三节)
  • 有序列表(ordered list)的编号(多用小写字母),例如:
    • i) 第一项
    • ii) 第二项
    • iii) 第三项
    • iv) 第四项
    • v) 第五项
    • vi) 第六项

罗马计数法的基本规则

罗马计数法使用迭加计数的方式,下面是罗马计数法的基础数值定义:

  • I(表示十进制数1)
  • V(表示5)
  • X(表示10)
  • L(表示50)
  • C(表示100)
  • D(表示500)
  • M(表示1000)

这些基本数字,经过复合可以表示其它的数,最基本记数的方法如下:

  • 相同的数字列表示相加。如:II表示十进制数2ⅩⅩⅩ表示十进制数30
  • 不同的数字并列,右边的小于左边的表示相加。如:表示十进制数6LX表示十进制数60
  • 不同的数字并列,左边的小于右边的表示右边的减去左边的
代码语言:javascript
复制
比如1829,记成MDCCCXXIX,
分解下来就是: 千位:M;百位:DCCC;十位:XX;个位:IX

常用数字:

代码语言:javascript
复制
1~10: I II III IV V VI VII VIII IX X

11~20: XI XII XIII XIV XV XVI XVII XVIII XIX XX

21~30: XXI XXII XXIII XXIV XXV XXVI XXVII XXVIII XXIX XXX

31~40: XXXIXXXII XXXIII XXXIV XXXV XXXVI XXXVII XXXVIII XXXIX XL

41~50: XLI XLII XLIII XLIV XLV XLVI XLVII XLVII XLIX L

部分数字对应的阿拉伯数字和拉丁文名称:

代码语言:javascript
复制
I - 1 unus
II - 2 duo
III - 3 tres
IV - 4 quattuor
V - 5 quinque
VI - 6 sex
VII - 7 septem
VIII - 8 octo
IX - 9 novem
X - 10 decem
XI - 11 undecim
XII - 12 duodecim
XIII - 13 tresdecim
XIV - 14 quattuordecim
XV - 15 quindecim
XVI - 16 sedecim
XVII - 17  septendecim
XVIII - 18 duodeviginti
XIX - 19 undeviginti
XX - 20 viginti
XXI - 21 viginti unus
XXII - 22 viginti duo
XXVIII - 28 duodetriginta
XXIX - 29  undetriginta
XXX - 30 triginta
XL - 40 quadraginta
L - 50  quinquaginta

需要注意的是罗马数字中没有“0”,与进位制无关。

一般认为罗马数字只用来记数,而不作演算

用JS算算罗马计数法的出生年份

按照以上规则,写一个简单的函数,就可以得到一个闪亮炫酷的罗马计数法出生年份了:

代码语言:javascript
复制
const ROMAN_NUMBERS = [
   [1000, "M"],
   [900, "CM"],
   [500, "D"],
   [400, "CD"],
   [100, "C"],
   [90, "XC"],
   [50, "L"],
   [40, "XL"],
   [10, "X"],
   [9, "IX"],
   [5, "V"],
   [4, "IV"],
   [1, "I"]
];

function getRomanBirthYear(n) {    
    return ROMAN_NUMBERS.reduce(
        (prev, rnItem)=>{
             const
               [num, rom] = rnItem,
               rmdr = prev.remainder
           ;            
            
            if (num > rmdr) //遍历到的基数比余数要大,略过
               return prev;
            
            return {
                remainder: rmdr % num,
                roman: prev.roman + Array( //拼接字符串
                   Math.floor(rmdr / num) + 1
               ).join(rom) //基数 + 若干更小的基数
           };
       }, {
            remainder: n, //需要处理的余数,如1982->982->82->2
           roman: '' //已处理好的罗马字母
       }
   ).roman;  
}
            
            
var y = getRomanBirthYear(1997);
console.log(y); //MCMXCVII

参考资料:

  • http://blog.163.com/celia_0827/blog/static/52447320125166475519/
  • http://www.baike.com/wiki/记数法
  • http://www.baike.com/wiki/十进制计数法
  • http://rosettacode.org/wiki/Roman_numerals/Encode#ES6
  • http://www.baike.com/wiki/苏州码子
  • https://zh.wikipedia.org/zh-hans/罗马数字
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云前端 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 计数法的渊源
  • 罗马计数法的常见用途
  • 罗马计数法的基本规则
  • 用JS算算罗马计数法的出生年份
  • 参考资料:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档