转换为罗马数字的javascript算法

转换为罗马数字的javascript算法,javascript,algorithm,Javascript,Algorithm,下面的算法是将序数转换为罗马数。它适用于大多数数字,但对其中一些数字来说仍然存在问题。例如,数字500或1000不起作用,我不知道为什么。我知道我错过了什么;有什么帮助吗 代码是: function convertToRoman(num) { //TABLE OF EQUIVALENCES var arrConv=[{1:'I'},{2:'II'},{3:'III'},{4:'IV'},{5:'V'},{6:'VI'},{7:'VII'},{8:'VIII'},{9:'IX'},{10:

下面的算法是将序数转换为罗马数。它适用于大多数数字,但对其中一些数字来说仍然存在问题。例如,数字500或1000不起作用,我不知道为什么。我知道我错过了什么;有什么帮助吗

代码是:

function convertToRoman(num) {
  //TABLE OF EQUIVALENCES
  var arrConv=[{1:'I'},{2:'II'},{3:'III'},{4:'IV'},{5:'V'},{6:'VI'},{7:'VII'},{8:'VIII'},{9:'IX'},{10:'X'},{20:'XX'},{30:'XXX'},{40:'XL'},{50:'L'},{60:'LX'},{70:'LXX'},{80:'LXXX'},{90:'XC'},{100:'C'},{200:'CC'},{300:'CCC'},{400:'CD'},{500:'D'},{600:'DC'},{700:'DCC'},{800:'DCCC'},{900:'CM'},{1000:'M'},{2000:'MM'},{3000:'MMM'},{4000:'MMMM'},{5000:'MMMMM'},{6000:'MMMMMM'},{7000:'MMMMMMM'},{8000:'MMMMMMMM'},{9000:'MMMMMMMMM'}];

  //First we break down the number into its units
  //and create an array ex: 652 ==> [600, 50, 2]
  var arr=[num.length];
  arr=num.toString().split("").reverse();
  var i=1;
  for (var k=0;k<arr.length;k++){
    arr.splice(k,1,arr[k]*i);
    i*=10;
  }

  //We make an array of objects with the number and the roman number equivalence
 var romansArray=[];
  for (i=0;i<arr.length;i++){
    var val=arrConv.filter(function(obj){
       return obj[arr[i]];
     })[0];
    romansArray.push(val);
  }

  //I get rid of all the null values
  var result=romansArray.filter(function(val){
    return (val!=null);
  });

  //It returns the string with the roman number
  return result.map(function(value,key){
    return result[key][arr[key]];
  }).reverse().join("");

}
函数转换器(num){
//当量表
{1:''I{,,{{{{{1:''''I',,,{{{1:''1,,{{5:''5,,,{6:,,{{6:,,{{{{{{1:'1:'''I',,{{1 1:'1,,,,{2:'2:,,,,,{3:'3:'3:,,,,,{3:'3:'3:'3:'3:'3:,,,,,,,,,,,,,,{3,{3:'3:'3:'3:,,,,,,,,,,,,,,,,,,,,,,,,,,,{3:'3,,,,,,,,,,,,,,,{3,,,,,,,,,,,,,,,,,{3,,{3:{300:'CCC'}、{400:'CD'}、{500:'D'}、{600:'DC'}、{700:'DCC'}、{800:'DCCC'}、{900:'CM'}、{1000:'M'}、{2000:'MM'}、{3000:'MMM'}、{4000:'MMMM'},{5000:'MMMMMM'},{6000:'MMMMMMMM'},{7000:'mmmmmmmmmm'},{8000:'mmmmmmmmmm'},{9000:'mmmmmmmmmm'}];
//首先,我们把数字分解成单位
//并创建一个数组ex:652==>[600,50,2]
var arr=[num.length];
arr=num.toString().split(“”.reverse();
var i=1;
对于(var k=0;k你可以改变一点

  • 对象而不是对象数组

  • 值的访问

  • 未知零件的默认值

  • 然后可以省略对
    null
    值的过滤

函数转换器(num){
var arrConv={1:'I',2:'II',3:'III',4:'IV',5:'V',6:'VI',7:'VII',8:'VIII',9:'IX',10:'X',20:'XX',30:'XXX',40:'XL',50:'L',60:'LX',70:'LXX',80:'LXXX',90:'XC',100:'C',200:'CC',300:'CCC',400:'CD',500:'D',600:'DC',700:'DCC',800:'DCC',800:'DCCC',900:'CM',1000:'M',2000:'MM''MMMMMMMM',7000:'MMMMMMMM',8000:'MMMMMMMM',9000:'mmmmmmmmmm'};
var arr=num.toString().split(“”.reverse(),
i=1,k;
对于(k=0;k
您可以做一些更改

  • 对象而不是对象数组

  • 值的访问

  • 未知零件的默认值

  • 然后可以省略对
    null
    值的过滤

函数转换器(num){
var arrConv={1:'I',2:'II',3:'III',4:'IV',5:'V',6:'VI',7:'VII',8:'VIII',9:'IX',10:'X',20:'XX',30:'XXX',40:'XL',50:'L',60:'LX',70:'LXX',80:'LXXX',90:'XC',100:'C',200:'CC',300:'CCC',400:'CD',500:'D',600:'DC',700:'DCC',800:'DCC',800:'DCCC',900:'CM',1000:'M',2000:'MM''MMMMMMMM',7000:'MMMMMMMM',8000:'MMMMMMMM',9000:'mmmmmmmmmm'};
var arr=num.toString().split(“”.reverse(),
i=1,k;
对于(k=0;kconsole.log(convertToRoman(1000));
Nina Scholz的答案是正确的(而且也很优雅),但是请注意,您在使用零时遇到了问题(实际上,就像罗马人一样!)

如果希望代码正常工作,则必须将零添加到转换数组中,首先考虑的是添加
{0:'}
,然后,作为空字符串,筛选函数将失败,因此可以为键“0”添加一个空格,最后对结果应用修剪

大概是这样的:

function convertToRoman(num) {
  //TABLE OF EQUIVALENCES
  var arrConv=[{0:' '},{1:'I'},{2:'II'},{3:'III'},{4:'IV'},{5:'V'},{6:'VI'},{7:'VII'},{8:'VIII'},{9:'IX'},{10:'X'},{20:'XX'},{30:'XXX'},{40:'XL'},{50:'L'},{60:'LX'},{70:'LXX'},{80:'LXXX'},{90:'XC'},{100:'C'},{200:'CC'},{300:'CCC'},{400:'CD'},{500:'D'},{600:'DC'},{700:'DCC'},{800:'DCCC'},{900:'CM'},{1000:'M'},{2000:'MM'},{3000:'MMM'},{4000:'MMMM'},{5000:'MMMMM'},{6000:'MMMMMM'},{7000:'MMMMMMM'},{8000:'MMMMMMMM'},{9000:'MMMMMMMMM'}];

  //First we break down the number into its units
  //and create an array ex: 652 ==> [600, 50, 2]
  var arr=[num.length];
  arr=num.toString().split("").reverse();
  var i=1;
  for (var k=0;k<arr.length;k++){
    arr.splice(k,1,arr[k]*i);
    i*=10;
  }

  //We make an array of objects with the number and the roman number equivalence
 var romansArray=[];
  for (i=0;i<arr.length;i++){
    var val=arrConv.filter(function(obj){
       return obj[arr[i]];
     })[0];
    romansArray.push(val);
  }

  //I get rid of all the null values
  var result=romansArray.filter(function(val){
    return (val!=null);
  });

  //It returns the string with the roman number
  return result.map(function(value,key){
    return result[key][arr[key]];
  }).reverse().join("").trim();

}
函数转换器(num){
//当量表
[0 0::::,{0 0:::,,{0 0:::,,{0 0,,{0,,{3:'3,,{5:,,{5:'5,,{5:,,{{00 0::,{00 0 0::::,{0 0,,,,,{1 1:'1:'1:,,,,,,,,,,,,{2:'2:'2:,,,,,,,,,,,,,{3:'2:'2:'2:,,,,,,,,,,,,,,,,,{3,,,,,,,,,,,,,,,,,{3,,,,,,,,,,,,,,,,,,,,{3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,{0200:'CC'}、{300:'CCC'}、{400:'CD'}、{500:'D'}、{600:'DC'}、{700:'DCC'}、{800:'DCCC'}、{900:'CM'}、{1000:'M'}、{2000:'MM'}、{3000:'MMM'}、{4000:'MMMM'},{5000:'MMMMMM'},{6000:'MMMMMMMM'},{7000:'mmmmmmmmmm'},{8000:'mmmmmmmmmm'},{9000:'mmmmmmmmmm'}];
//首先,我们把数字分解成单位
//并创建一个数组ex:652==>[600,50,2]
var arr=[num.length];
arr=num.toString().split(“”.reverse();
var i=1;

对于(var k=0;k来说,@Nina-Scholz的答案是正确的(也是优雅的),但是请注意,你对零有困难(实际上,就像罗马人一样!)

如果希望代码正常工作,则必须将零添加到转换数组中,首先考虑的是添加
{0:'}
,然后,作为空字符串,筛选函数将失败,因此可以为键“0”添加一个空格,最后对结果应用修剪

大概是这样的:

function convertToRoman(num) {
  //TABLE OF EQUIVALENCES
  var arrConv=[{0:' '},{1:'I'},{2:'II'},{3:'III'},{4:'IV'},{5:'V'},{6:'VI'},{7:'VII'},{8:'VIII'},{9:'IX'},{10:'X'},{20:'XX'},{30:'XXX'},{40:'XL'},{50:'L'},{60:'LX'},{70:'LXX'},{80:'LXXX'},{90:'XC'},{100:'C'},{200:'CC'},{300:'CCC'},{400:'CD'},{500:'D'},{600:'DC'},{700:'DCC'},{800:'DCCC'},{900:'CM'},{1000:'M'},{2000:'MM'},{3000:'MMM'},{4000:'MMMM'},{5000:'MMMMM'},{6000:'MMMMMM'},{7000:'MMMMMMM'},{8000:'MMMMMMMM'},{9000:'MMMMMMMMM'}];

  //First we break down the number into its units
  //and create an array ex: 652 ==> [600, 50, 2]
  var arr=[num.length];
  arr=num.toString().split("").reverse();
  var i=1;
  for (var k=0;k<arr.length;k++){
    arr.splice(k,1,arr[k]*i);
    i*=10;
  }

  //We make an array of objects with the number and the roman number equivalence
 var romansArray=[];
  for (i=0;i<arr.length;i++){
    var val=arrConv.filter(function(obj){
       return obj[arr[i]];
     })[0];
    romansArray.push(val);
  }

  //I get rid of all the null values
  var result=romansArray.filter(function(val){
    return (val!=null);
  });

  //It returns the string with the roman number
  return result.map(function(value,key){
    return result[key][arr[key]];
  }).reverse().join("").trim();

}
函数转换器(num){
//当量表
[0 0::::,{0 0:::,,{0 0:::,,{0 0,,{0,,{3:'3,,{5:,,{5:'5,,{5:,,{{00 0::,{00 0 0::::,{0 0,,,,,{1 1:'1:'1:,,,,,,,,,,,,{2:'2:'2:,,,,,,,,,,,,,{3:'2:'2:'2:,,,,,,,,,,,,,,,,,{3,,,,,,,,,,,,,,,,,{3,,,,,,,,,,,,,,,,,,,,{3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,{0200:'CC'}、{300:'CCC'}、{400:'CD'}、{500:'D'}、{600:'DC'}、{700:'DCC'}、{800:'DCCC'}、{900:'CM'}、{1000:'M'}、{2000:'MM'}、{3000:'MMM'}、{4000:'MMMM'},{5000:'MMMMMM'},{6000:'MMMMMMMM'},{7000:'mmmmmmmmmm'},{8000:'mmmmmmmmmm'},{9000:'mmmmmmmmmm'}];
//首先,我们把数字分解成单位
//并创建一个数组ex:652==>[600,50,2]
var arr=[num.length];
arr=num.toString().split(“”.reverse();
var i=1;

对于(var k=0;k3999之前的有效数字算法之一。它的工作原理类似于映射表

function convertToRoman(num) {
  var arr =[];
  var arr = num.toString().split('');
  var numarry =[];
  var count =0;

  for(var i = arr.length; i>0;i--){
    numarry.push(Number(arr[count])*Math.pow(10,i-1));
    ++count;
  }


var rom =[];
 debugger;
for(var i=0;i<numarry.length;i++)
{

  switch(numarry[i].toString().length){
      case 1:switch(numarry[i]){
        case 0 : rom.push( ''); continue;
        case 1 : rom.push( 'I'); continue;
        case 2 : rom.push( 'II'); continue;
        case 3 : rom.push( 'III'); continue;
        case 4 : rom.push( 'IV'); continue;
        case 5 : rom.push( 'V'); continue;
        case 6 : rom.push( 'VI');  continue;
        case 7 : rom.push( 'VII'); continue;
        case 8 : rom.push( 'VIII'); continue;
        case 9 : rom.push( 'IX'); continue;
        case 10 : rom.push( 'X');  continue; 
        default : rom.push( null);     continue; 
      }continue;
      case 2:switch(numarry[i]){
        case 0 : rom.push( ''); continue;
        case 10 : rom.push( 'X'); continue;
        case 20 : rom.push( 'XX'); continue;
        case 30 : rom.push( 'XXX'); continue;
        case 40 : rom.push( 'XL'); continue;
        case 50 : rom.push( 'L'); continue;
        case 60 : rom.push( 'LX');  continue;
        case 70 : rom.push( 'LXX'); continue;
        case 80 : rom.push( 'LXXX'); continue;
        case 90 : rom.push( 'XC'); continue;
        case 100 : rom.push( 'C'); continue;  
        default : rom.push( null); continue;    
      } continue;
      case 3:switch(numarry[i]){
        case 0 : rom.push( ''); continue;
        case 100 : rom.push( 'C'); continue;
        case 200 : rom.push( 'CC'); continue;
        case 300 : rom.push( 'CCC'); continue;
        case 400 : rom.push( 'CD'); continue;
        case 500 : rom.push( 'D'); continue;
        case 600 : rom.push( 'DC');  continue;
        case 700 : rom.push( 'DCC'); continue;
        case 800 : rom.push( 'DCCC'); continue;
        case 900 : rom.push( 'CM'); continue;
        case 1000 : rom.push( 'M');  continue; 
        default : rom.push( null);continue;      
      } continue;
      case 4:switch(numarry[i]){
        case 0 : rom.push( ''); 
        case 1000 : rom.push( 'M'); continue;
        case 2000 : rom.push( 'MM'); continue;
        case 3000 : rom.push( 'MMM'); continue;

        default : rom.push( null);      
      } continue;


  }


}
  return rom.join('') ;
}
convertToRoman(500);
函数转换器(num){
var-arr=[];
var arr=num.toString().split(“”);
var numary=[];
var计数=0;
对于(变量i=arr.length;i>0;i--){
numary.push(数字(arr[count])*Math.pow(10,i-1));
++计数;
}
var-rom=[];
调试器;
对于(var i=0;iO