codecamp

数字转罗马数字

方法一:

function convert(num) { //此算法仅限定在1~3999之间
  var roman = '';
  var Ro = ['M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I']; //枚举几个特殊的数值,包括7个基础字母和6个4,9开头的特殊符号
  var Nu = [1000,900,500,400,100,90,50,40,10,9,5,4,1]; //枚举几个特殊的数值,与上对应
  for(var i = 0;i < Nu.length;i++){ //先遍历Nu数组的每一个数
    while(num >= Nu[i]){ //然后再进行一个个对比,只要num大于Nu数组里的数,就保持while循环
      roman += Ro[i]; //罗马数字加上对应的字母
      num -= Nu[i]; //阿拉伯数字减去对应的数字
    }
  }
 return roman;
}




convert(4);

方法二:

function convert(num) {
  var arr_0_9 = ['','I','II','III','IV','V','VI','VII','VIII','IX'],
      arr_10_90 = ['','X','XX','XXX','XL','L','LX','LXX','LXXX','XC'],
      arr_100_900 = ['','C','CC','CCC','CD','D','DC','DCC','DCCC','CM'],
      arr_1000_9000 = ['','M','MM','MMM','MMMM','MMMMM','MMMMMM','MMMMMMM','MMMMMMMM','MMMMMMMMM'];
  var str = num.toString(),
      str2Arr = [],
      r = '';
  if(str.length<4){
    switch (str.length){
      case 3:
        str = '0'+str;
        break;
      case 2:
        str = '00'+str;
        break;    
      case 1:
        str = '000'+str;
        break; 
      default:
        str = '0000';
    }    
  }
  str2Arr = str.split('');
  for(var i=0;i<4;i++){
    switch (i){
      case 3:
        r+= arr_0_9[parseInt(str2Arr[i])];
        break;
      case 2:
        r+= arr_10_90[parseInt(str2Arr[i])];
        break;    
      case 1:
        r+= arr_100_900[parseInt(str2Arr[i])];
        break; 
      default:
        r+= arr_1000_9000[parseInt(str2Arr[i])];
    }     
  }

  
  return r;
}


convert(36);

方法三:

var convert=(function() {
  //1 5 10 50 100 500 1000
  //I V  X  L  C   D   M
  var i=0;
  var arr=[["I","V"],["X","L"],["C","D"],["M"]];  //检索的数组缓存起来

  
  return function(num){
    var str="";
    var num_arr=String(num).split("");
    for(var i=0,l=num_arr.length;i<l;i++){ //对每一位的数字进行处理
      var x=parseInt( num_arr[i] );
      str+=handle(arr[l-1-i],arr[l-i],x); //传参
    }
    return str;
  };

  
})();


function handle(arr,big_arr,x){ //这里是对输入的x数字进行处理,arr和big_arr根据传参确定,这里对应的是罗马数字规则
  var res="";
  if( x===0 ){
    return res;
  }

  
  if( x<=3 ){
      for(i=0;i<x;i++){
        res+=arr[0];
      }     
  }else if( x==4 ){
    res=arr[0]+arr[1];
  }else if( x==9 ){
    res=arr[0]+big_arr[0];
  }else{   //大于等于5但是小于9的
    var cha=x-5;
    res=arr[1];
    for(i=0;i<cha;i++){
      res+=arr[0];
    }
  }
  return res;
}


convert(36);
找出数组间差异算法挑战
对象搜索算法挑战
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定