LeetCode题目:
Integer to Roman
Roman to Integer
罗马数字规则
罗马数字共有7个,即I(1),V(5),X(10),L(50),C(100),D(500),M(1000)。按照下面的规则可以表示任意正整数。
- 重复数次:1个罗马数字重复几次,就表示这个数的几倍。
- 右加左减:在一个较大的罗马数字的右边记上一个较小的罗马数字,表示大数字加小数字。在一个较大的数字的左边记上1个较小的罗马数字,表示大数字减小数字。但是,左减不能跨越一个位数。比如,99不可以用IC表示,而是用XCIX表示。此外,左减数字不能超过1位,比如8写成VIII,而非IIX。同理,右加数字不能超过3位,比如14写成XIV,而非XIIII。
- 加线乘千:在1个罗马数字的上方加上1条横线或者在右下方写M,表示将这个数字乘以1000,即是原数的1000倍。同理,如果上方有2条横线,即是原数的1000000倍。
- 单位限制:同样单位只能出现3次,如40不能表示为XXXX,而要表示为XL。但是,由于IV是古罗马神话主神朱庇特(IVPITER,古罗马字母没有J和U)的首字,因此有时用IIII代替IV。
JavaScript转换算法(适用于1-3999的整数)
//阿拉伯数字转罗马数字
var intToRoman = function(num) {
var Roman = ["I", "V", "X", "L", "C", "D", "M"]; //1,5,10,50,100,500,1000
var k = 0,
res = "";
while (num > 0) {
var n = num % 10;
var cur = "";
if (n <= 3) {
while (n--) {
cur += Roman[2 * k];
}
} else if (n == 4) {
cur += Roman[2 * k] + Roman[2 * k + 1];
} else if (n <= 8) {
cur += Roman[2 * k + 1];
while (--n >= 5) {
cur += Roman[2 * k];
}
} else if (n == 9) {
cur += Roman[2 * k] + Roman[2 * (k + 1)];
}
res = cur + res;
num = parseInt(num / 10);
k++;
}
return res;
};
//罗马数字转阿拉伯数字
var romanToInt = function(s) {
var Roman = ["I", "V", "X", "L", "C", "D", "M"];
var Int = [1, 5, 10, 50, 100, 500, 1000];
var res = 0;
for (var i = 0; i < s.length; i++) {
var cur = Roman.indexOf(s[i]);
if (cur % 2 == 0) {
var next = Roman.indexOf(s[i + 1]);
if (next - cur == 1 || next - cur == 2) {
res += Int[next] - Int[cur];
i++;
} else {
res += Int[cur];
}
} else {
res += Int[cur];
}
}
return res;
};
for (var i = 1; i <= 3999; i++) {
var roman = intToRoman(i)
var int = romanToInt(roman)
console.log(i, roman, int)
}
2018.2.6重做补充
//阿拉伯转罗马数字
function convertToRoman(num) {
/*
1 I
5 V
10 X
50 L
100 C
500 D
1000 M
*/
var arr = [
["I", "V"],
["X", "L"],
["C", "D"],
["M"]
];
var res = [];
var count = 0;
while (num > 0) {
var p = num % 10;
switch (p) {
case 0:
break;
case 1:
case 2:
case 3:
res.unshift(arr[count][0].repeat(p));
break;
case 4:
res.unshift(arr[count][0] + arr[count][1]);
break;
case 5:
res.unshift(arr[count][1]);
break;
case 6:
case 7:
case 8:
res.unshift(arr[count][1] + arr[count][0].repeat(p - 5));
break;
case 9:
res.unshift(arr[count][0] + arr[count + 1][0]);
break;
default:
break;
}
num = Math.floor(num / 10);
count++;
}
return res.join("");
}
console.log(convertToRoman(3999));
网友评论