如上图所示,罗马数字由7个基本字符组成['I','V','X','L','C','D','M'],阿拉伯数字num转换时需将数字经过求余运算,对千位以上、百位、十位和个位分别进行处理。
一、千位以上
num/1000的结果为n,结果字符串result需重复n次字符‘M’;可抽象如下函数,重复给定字符char, n次.
function repeatC(char,count){
var result="";
for(var i=0;i<count;i++){
result+=char;
}
return result;
}
二、百位、十位和个位的处理
百位、十位、位的处理类似,以个位处理为例:
当1<=n<=3时,result字符串为重复特定字符 'I' n次;
当n==4时,4=5-1 result字符串为"IV";
当5<=n<=8时,result字符串为'V'+repeatC('I',n-5);
当n==9时,9=10-1,result字符串为"XI";
由此可看出个位数可由'I','V','X'三个字符组合而成。可抽象如下函数:
function generBase(num,arr){
var result="";
if(num>=1&&num<=3){
result=repeatC(arr[0],num);
}
if(num===4){
result=arr[0]+''+arr[1];
}
if(num>=5&&num<=8){
result=arr[1]+''+repeatC(arr[0],num-5);
}
if(num===9){
result=arr[0]+""+arr[2];
}
return result;
}
三、转换为罗马数字
转换函数需要对任意输入的数字n做出判断,通过不断的取余分别对不同的数字位做出相应的处理,转换函数如下:
function convert(num) {
var result="";
if(num>=1000){
result=repeatC('M',Math.floor(num/1000));
num %= 1000;
}
if(num>=100){
result+=generBase(Math.floor(num/100),['C','D','M']);
num %= 100;
}
if(num>=10){
result+=generBase(Math.floor(num/10),['X','L','C']);
num %= 10;
}
if(num>=1){
result+=generBase(Math.floor(num),['I','V','X']);
}
return result;
}
示例:convert(2953);
运行结果为:MMCMLIII;