人们十年如一日(不是说杜X斯的广告)的又迎来了一年一度的苹果发布会,作为史上被提前爆料最多的一届,还是在产品的命名上给了人们一些惊喜或是纳闷儿之处 --- 传说中的7s直接变成了8,而iphone9和windows9的贴吧吧主据说抱头痛哭晕在了厕所;最重量级的新手机被命名为了 iPhone X。
需要注意的是,不要再像Windows XP
那样读成不雅的"瘟□□"了,正确的读音是 “爱凤十” (pronounced iPhone Ten)。
那么问题来了,为什么用 X
表示 10
呢?其实大家日常中也能经常见到的是,手表钟表老怀表上,就是这么表示数字的,其正式的称呼是 --- “罗马计数法”
【西玛表】
【罗马表】
计数法就是记录或标志数目的方法,主要指数字符号的表现形态和记数工具的使用
除了当今通行的阿拉伯数字十进制计数法,历史上主要使用的计数法还有:
罗马计数法使用迭加计数的方式,下面是罗马计数法的基础数值定义:
这些基本数字,经过复合可以表示其它的数,最基本记数的方法如下:
II
表示十进制数2
,ⅩⅩⅩ
表示十进制数30
Ⅵ
表示十进制数6
,LX
表示十进制数60
比如1829,记成MDCCCXXIX,
分解下来就是: 千位:M;百位:DCCC;十位:XX;个位:IX
常用数字:
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
部分数字对应的阿拉伯数字和拉丁文名称:
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”,与进位制无关。
一般认为罗马数字只用来记数,而不作演算
按照以上规则,写一个简单的函数,就可以得到一个闪亮炫酷的罗马计数法出生年份了:
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