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

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

今天的这道,是这样滴:

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。

你可能感兴趣的:(算法)