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

来源:互联网 发布:微信贷款申请系统源码 编辑:程序博客网 时间:2024/05/16 05:59

每日开始学习前,总是先来到算法题,提提神。大笑

今天的这道,是这样滴:

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。
原创粉丝点击