将数字转换为罗马数字时,我需要第一个数字" 2000"比所提供的数组大,添加数组的最大值,直到2000年为止。
在完成2000的数字输出后,我遇到了一个问题。它转到数组中的下一个数字,这是零! [2000,0,80,4]
如果它为零,我需要跳过。我尝试了一个finalnum [i]!= 0。
for (i = 0; i < finalnum.length; i++) {
var idx = romanNum.indexOf(finalnum[i]);
if (idx === -1 && finalnum[i] != 0) {
var max = romanNum.reduce(function(a, b) {
return (Math.max(a, b));
});
var amountoftimes = finalnum[i] / max;
idx = romanNum.indexOf(max);
romans.push(romanEquiv[idx].repeat(amountoftimes));
} //end of if statement
}
}
&#13;
var romanNum = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000];
var romanEquiv = ['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'];
function convertToRoman(num) {
//convert num to separate numbers
var indices = [];
var romans = [];
//split out the number first
var nextint = num.toString().split("");
var nextarr = [];
for (var i = 0; i < nextint.length; i++) {
var firstnum = "0".repeat(nextint.length - i - 1);
nextarr.push(nextint[i] + firstnum);
var finalnum = nextarr.map(Number);
}
//find the romannumerals
for (i = 0; i < finalnum.length; i++) {
var idx = romanNum.indexOf(finalnum[i]);
if (idx === -1 && finalnum[i] != 0) {
var max = romanNum.reduce(function(a, b) {
return (Math.max(a, b));
});
var amountoftimes = finalnum[i] / max;
idx = romanNum.indexOf(max);
romans.push(romanEquiv[idx].repeat(amountoftimes));
} //end of if statement
}
return romans.join('');
}
console.log(convertToRoman(2084));
&#13;
答案 0 :(得分:0)
测试finalnum[i] == 0
,并使用continue;
跳到下一个号码。
但是,其余代码似乎无法正常工作。它仍然只返回"MM"
。您的算法还存在其他问题
您还应该在函数中使用return
。在呼叫者中执行console.log()
。
BTW,reduce
循环可以替换为:
var max = Math.max.apply(Math, romanNum);
我不确定你为什么需要这个变量,而且每次循环时你都不需要计算它,因为romanNum
数组永远不会改变。它似乎是你困惑的算法的一部分。关于转换为罗马数字的SO(以及Code Review)还有很多其他问题,你可以看看它们。
var romanNum = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000];
var romanEquiv = ['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'];
function convertToRoman(num) {
//convert num to separate numbers
var indices = [];
var romans = [];
//split out the number first
var nextint = num.toString().split("");
var nextarr = [];
for (var i = 0; i < nextint.length; i++) {
var firstnum = "0".repeat(nextint.length - i - 1);
nextarr.push(nextint[i] + firstnum);
var finalnum = nextarr.map(Number);
}
//find the romannumerals
for (i = 0; i < finalnum.length; i++) {
if (finalnum[i] == 0) { // skip zeroes
continue;
}
var idx = romanNum.indexOf(finalnum[i]);
if (idx === -1 && finalnum[i] != 0) {
var max = romanNum.reduce(function(a, b) {
return (Math.max(a, b));
});
var amountoftimes = finalnum[i] / max;
idx = romanNum.indexOf(max);
romans.push(romanEquiv[idx].repeat(amountoftimes));
} //end of if statement
}
return romans.join('');
}
console.log(convertToRoman(2084));
&#13;