您的位置:首页 > Web前端 > JavaScript

JavaScript实现1-4000内阿拉伯数字转换为罗马数字

2017-09-04 10:32 681 查看
每日开始学习前,总是先来到算法题,提提神。


今天的这道,是这样滴:

convert(1006) 应该返回 “MVI”。 
convert(1023) 应该返回 “MXXIII”。 
convert(2014) 应该返回 “MMXIV”。 
convert(3999) 应该返回 “MMMCMXCIX”。

铛铛,实现1-4000内的阿拉伯数字转换为罗马数字!

想做出这道题,首先你需要了解啥是罗马数字,我们查阅资料可见:

一、什么是罗马数字?
    罗马数字是最早的数字表示方式,比阿拉伯数字早2000多年,起源于罗马。如今我们最常见的罗马数字就是钟表的表盘符号:Ⅰ, Ⅱ , Ⅲ ,Ⅳ ,Ⅴ ,Ⅵ ,Ⅶ ,Ⅷ ,Ⅸ ,Ⅹ ,Ⅺ ,Ⅻ ……对应阿拉伯数字(就是现在国际通用的数字),就是1,2,3,4,5,6,7,8,9,10,11,12。阿拉伯数字其实是古代印度人发明的,后来由阿拉伯人传入欧洲,被欧洲人误称为阿拉伯数字。

二、罗马数字记数方法
    基本字符:
        I、V、X、L、C、D、M
    相应的阿拉伯数字表示为:
        1、5、10、50、100、500、1000

    (1)相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
    (2)小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
    (3)小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
    (4)正常使用时,连写的数字重复不得超过三次。(表盘上的四点钟“IIII”例外)
    (5)在一个数的上面画一条横线,表示这个数扩大1000倍。

还是挺复杂滴,主要的点就是:1)连写的数字不能超过三次,也就是III只能写到3,想玩4,6,7...就得想招啦。2)大左小右为+,小左大右为-,具体数字表示起来取方便的那种。
既然有了上述规则,我们就可以写啦,先上一个复杂版。

超级复杂版: 

var a=0;
var b=0;
var c=0;
var d=0;
var y=num.toString();
var newN=y.split("");//数字分开成数组['3','6']
var num1=newN.length;
if(num1==1){
d=num;
}else if(num1==2){
c=parseInt(newN[0]);
d=parseInt(newN[1]);
}else if(num1==3){
b=parseInt(newN[0]);
c=parseInt(newN[1]);
d=parseInt(newN[2]);
}else if(num1==4){
a=parseInt(newN[0]);
b=parseInt(newN[1]);
c=parseInt(newN[2]);
d=parseInt(newN[3]);
}
var rea="";
var reb="";
var rec="";
var red="";
for(i=1;i<=a;i++){
rea=rea+"M";
}
if(b<4){
for(i=1;i<=b;i++){
reb=reb+"C";
}
}else if(b==4){
reb="CD";
}else if(b<9){
reb="D";
for(i=1;i<=b-5;i++){
reb=reb+"C";
}
}else if(b==9){
reb="CM";
}
if(c<4){
for(i=1;i<=c;i++){
rec=rec+"X";
}
}else if(c==4){
rec="XL";
}else if(c<9){
rec="L";
for(i=1;i<=c-5;i++){
rec=rec+"X";
}
}else if(c==9){
rec="XC";
}
if(d<4){
for(i=1;i<=d;i++){
red=red+"I";
}
}else if(d==4){
red="IV";
}else if(d<9){
red="V";
for(i=1;i<=d-5;i++){
red=red+"I";}
}else if(d==9){
red="IX";
}
var result=rea+reb+rec+red;
return result;
}

简单来说,分出4位,把每一位的情况都做一个判断。(。・∀・)ノ゙嗨,您累不累哟。作为猿,我们的存在就是为了偷懒嘛。于是乎,只需要一个小小的方法,就可以避免一大串的判断。

超级简单版:

function convert(num) {
var a=[["","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"]];
var i=a[3][Math.floor(num/1000)];
var j=a[2][Math.floor(num%1000/100)];
var k=a[1][Math.floor(num%100/10)];
var l=a[0][num%10];
return  i+j+k+l;

}

convert(36);

这里用到了floor()方法,floor()方法用来“下舍取余”这样的话,每一位取到哪个数,就赋值对应数组种的罗马数字位置,搞定。so easy。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript 算法