转换为罗马数字的javascript算法
下面的算法是将序数转换为罗马数。它适用于大多数数字,但对其中一些数字来说仍然存在问题。例如,数字500或1000不起作用,我不知道为什么。我知道我错过了什么;有什么帮助吗 代码是:转换为罗马数字的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:
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;k console.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