原题在这里。
简单翻译一下。
罗马数字用7个不同的符号表示,I, V, X, L, C, D 和 M。
符号 值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如,2写作II,12写作XII,4写作IV,可以理解为5-1,类似的有9,写作IX,可以理解为10-1,40写作XL,90写作XC,400写作CD,900写作CM。
那么,问题来了,指定一个1-3999的整数,将其转换为罗马数字。
举个例子
Input: 1994
Output: "MCMXCIV"
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
思路就是我们要取出指定整数n的各个位上的数字做转换。
个位数取值范围是
["I","II","III","IV","V","VI","VII","VIII","IX"];
十位数取值范围是
["X","XX","XXX","XL","L","LX","LXX","LXXX","XC"];
百位数取值范围是
["C","CC","CCC","CD","D","DC","DCC","DCCC","CM"];
千位数取值范围
["M","MM","MMM"];
需要注意的是,当某位取值为0的时候,这个时候是不需要找对应的罗马数字的。为什么呢?我们假设对308转换,因为罗马数字定义了30为XXX,8为VIII,所以是XXXVIII。
上段代码吧,很简单。
function integer_to_roman(num) {
var M = ["", "M", "MM", "MMM"];
var C = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"];
var X = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"];
var I = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"];
return M[parseInt(num / 1000)] + C[parseInt((num % 1000) / 100)] + X[parseInt((num % 100) / 10)] + I[num % 10];
}
console.log(integer_to_roman(1994));