在JavaScript中将数字转换为罗马数字

96

我该如何将整数转换为罗马数字

function romanNumeralGenerator (int) {

}
例如,看下面的样例输入和输出:
1 = "I"
5 = "V"
10 = "X"
20 = "XX"
3999 = "MMMCMXCIX"

注意:仅支持1到3999之间的数字。

96个回答

1
function convertToRoman(num) {
  var romNumerals = [["M", 1000], ["CM", 900], ["D", 500], ["CD", 400], ["C", 100], ["XC", 90], ["L", 50], ["XL", 40], ["X", 10], ["IX", 9], ["V", 5], ["IV", 4], ["I", 1]];
  var runningTotal = 0;
  var roman = "";
  for (var i = 0; i < romNumerals.length; i++) {
    while (runningTotal + romNumerals[i][1] <= num) {
      runningTotal += romNumerals[i][1];
      roman += romNumerals[i][0];
    }
  }

 return roman;
}

1
function convertToRoman(num) {

var roNumerals = {
    M: Math.floor(num / 1000),
    CM: Math.floor(num % 1000 / 900),
    D: Math.floor(num % 1000 % 900 / 500),
    CD: Math.floor(num % 1000 % 900 % 500 / 400),
    C: Math.floor(num % 1000 % 900 % 500 % 400 / 100),
    XC: Math.floor(num % 1000 % 900 % 500 % 400 % 100 / 90),
    L: Math.floor(num % 1000 % 900 % 500 % 400 % 100 % 90 / 50),
    XL: Math.floor(num % 1000 % 900 % 500 % 400 % 100 % 90 % 50 / 40),
    X: Math.floor(num % 1000 % 900 % 500 % 400 % 100 % 90 % 50 % 40 / 10),
    IX: Math.floor(num % 1000 % 900 % 500 % 400 % 100 % 90 % 50 % 40 % 10 / 9),
    V: Math.floor(num % 1000 % 900 % 500 % 400 % 100 % 90 % 50 % 40 % 10 % 9 / 5),
    IV: Math.floor(num % 1000 % 900 % 500 % 400 % 100 % 90 % 50 % 40 % 10 % 9 % 5 / 4),
    I: Math.floor(num % 1000 % 900 % 500 % 400 % 100 % 90 % 50 % 40 % 10 % 9 % 5 % 4 / 1)
  };
  var roNuStr = "";

  for (var prop in roNumerals) {
    for (i = 0; i < roNumerals[prop]; i++) {
      roNuStr += prop;
    }

  }
  return roNuStr;
}

convertToRoman(9);

1

这是我在freecodecamp中真正遇到困难的第一次。我查看了一些解决方案,惊讶于它们的不同之处。以下是最终适用于我的解决方案。

function convertToRoman(num) {
var roman = "";

var lookupObj = {
   1000:"M",
   900:"CM",
   500:"D",
   400:"CD",
   100:"C",
   90:"XC",
   50:"L",
   40:"XL",
   10:"X",
   9:"IX",   
   4:"IV",
   5:"V",
   1:"I",
};

var arrayLen = Object.keys(lookupObj).length;

while(num>0){

 for (i=arrayLen-1 ; i>=0 ; i--){

  if(num >= Object.keys(lookupObj)[i]){

    roman = roman + lookupObj[Object.keys(lookupObj)[i]];        
    num = num - Object.keys(lookupObj)[i];
    break;

  }
 }
}    

return roman;

}

convertToRoman(1231);

1

给你。

function check(digit, char1, char2, char3) {
  if(digit <=3) {
    return char1.repeat(digit)
  }if(digit == 4){
    return char1+char2
  }if(digit == 5) {
    return char2
  }if (digit > 5 && digit < 9) {
    return char2+char1.repeat(digit-5)
  }if(digit == 9) {
    return char1+char3
  }
}

function convertToRoman(num) {
  let result;
  let numList = String(num).split("").reverse()
  result = [check(parseInt(numList[0]), 'I', 'V', 'X'),check(parseInt(numList[1]), 'X', 'L', 'C'),check(parseInt(numList[2]), 'C', 'D', 'M'),'M'.repeat(parseInt(numList[3]))]

 return result.reverse().join('');
}

let res = convertToRoman(2);
console.log(res)

1

这是我的代码,希望对你有帮助:

function convertToRoman(num) {
    let numArr = [];//[M,D,C,L,X,V,I]
    let numStr = "";

    //get num Array
    numArr.push(parseInt(num / 1000));
    num %= 1000;
    numArr.push(parseInt(num / 500));
    num %= 500;
    numArr.push(parseInt(num / 100));
    num %= 100;
    numArr.push(parseInt(num / 50));
    num %= 50;
    numArr.push(parseInt(num / 10));
    num %= 10;
    numArr.push(parseInt(num / 5));
    num %= 5;
    numArr.push(num);

    //cancat num String
    for(let i = 0; i < numArr.length; i++) {
        switch(i) {
            case 0://M
                for(let j = 0; j < numArr[i]; j++) {
                    numStr = numStr.concat("M");
                }
                break;
            case 1://D
                switch(numArr[i]) {
                    case 0:
                        
                        break;
                    case 1:
                        if(numArr[i + 1] === 4) {
                            numStr = numStr.concat("CM");
                            i++;
                        }else {
                            numStr = numStr.concat("D");
                        }
                        break;
                }
                break;
            case 2://C
                switch(numArr[i]) {
                    case 0:
                        
                        break;
                    case 1:
                        numStr = numStr.concat("C");
                        break;
                    case 2:
                        numStr = numStr.concat("CC");
                        break;
                    case 3:
                        numStr = numStr.concat("CCC");
                        break;
                    case 4:
                        numStr = numStr.concat("CD");
                        break;
                }
                break;
            case 3://L
                switch(numArr[i]) {
                    case 0:
                        
                        break;
                    case 1:
                        if(numArr[i + 1] === 4) {
                            numStr = numStr.concat("XC");
                            i++;
                        }else {
                            numStr = numStr.concat("L");
                        }
                        break;
                }
                break;
            case 4://X
                switch(numArr[i]) {
                    case 0:
                        
                        break;
                    case 1:
                        numStr = numStr.concat("X");
                        break;
                    case 2:
                        numStr = numStr.concat("XX");
                        break;
                    case 3:
                        numStr = numStr.concat("XXX");
                        break;
                    case 4:
                        numStr = numStr.concat("XL");
                        break;
                }
                break;
            case 5://V
                switch(numArr[i]) {
                    case 0:
                        
                        break;
                    case 1:
                        if(numArr[i + 1] === 4) {
                            numStr = numStr.concat("IX");
                            i++;
                        }else {
                            numStr = numStr.concat("V");
                        }
                        break;
                }
                break;
            case 6://I
                switch(numArr[i]) {
                    case 0:
                        
                        break;
                    case 1:
                        numStr = numStr.concat("I");
                        break;
                    case 2:
                        numStr = numStr.concat("II");
                        break;
                    case 3:
                        numStr = numStr.concat("III");
                        break;
                    case 4:
                        numStr = numStr.concat("IV");
                        break;
                }
                break;
        }
    }
    console.log(numStr);
    return numStr;
}

convertToRoman(3999);


1

我只是想在stackoverflow上发布我的第一条评论 :)

function convertToRoman(num) {
  let romanNum = [
    [1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000, 4000],
    [
      "I",
      "IV",
      "V",
      "IX",
      "X",
      "XL",
      "L",
      "XC",
      "C",
      "CD",
      "D",
      "CM",
      "M",
      null,
    ],
  ];

  let romanConv = "";

  for (let i = 0; i < 4; i++) {
    for (let j = 0; j < romanNum[0].length; j++) {
      if (num >= romanNum[0][j] && num < romanNum[0][j + 1]) {
        let x = parseInt(num / romanNum[0][j]);
        romanConv += romanNum[1][j].repeat(x);
        num %= romanNum[0][j];
      }
    }
  }

  return romanConv;
}

console.log(convertToRoman(3999));


1
这是我发现的最简单、最容易的方法。

class RomanNumeral {
    constructor(value, symbol){
        this.value = value;
        this.symbol = symbol;
    }
}

const romanNumerals = [
    new RomanNumeral(1000, "M"),
    new RomanNumeral(900, "CM"),
    new RomanNumeral(500, "D"),
    new RomanNumeral(400, "CD"),
    new RomanNumeral(100, "C"),
    new RomanNumeral(90, "XC"),
    new RomanNumeral(50, "L"),
    new RomanNumeral(40, "XL"),
    new RomanNumeral(10, "X"),
    new RomanNumeral(9, "IX"),
    new RomanNumeral(5, "V"),
    new RomanNumeral(4, "IV"),
    new RomanNumeral(1, "I"),
];

function roman(number) {
    assertNumberInRomanLimits(number);
    let result = "";
    for (const { value , symbol  } of romanNumerals){
        while(number >= value){
            result += symbol;
            number -= value;
        }
    }
    return result;
}

function assertNumberInRomanLimits(number) {
    if (number > 3999) {
        throw new RangeError("The biggest number we can form in Roman numerals is MMMCMXCIX (3999).");
    }
    if (number < 1) {
        throw new RangeError("There is no concept of 0 or negatives in Roman numerals.");
    }
};

console.log(roman(3)); //=> "III"

console.log(roman(47)); //=> "XLVII"

console.log(roman(3990)); //=> "MMMCMXC"

console.log(roman(3999)); //=> "MMMCMXCIX"

console.log(roman(1984)); //=> "MCMLXXXIV"

如果您想使用此模块,您可以:

https://github.com/UltiRequiem/roman.js

https://ulti.js.org/roman.js

它包括100%的代码覆盖率、TypeScript类型和文档。

1

递归,转换前加1,转换后减去1:

const toRoman = (num, i="I", v="V", x="X", l="L", c="C", d="D", m="M") =>
    num ? toRoman(num/10|0, x, l, c, d, m, "?", "?", num%=10) +
          (i + ["",v,x][++num/5|0] + i.repeat(num%5)).replace(/^(.)(.*)\1/, "$2")
        : "";

console.log(toRoman(3999));


1
如果只是为了展示目的,使用标准的HTML,并加上一些JS用于值(如果需要),再用CSS使其内联:

ol.roman-lowercase,
ol.roman-uppercase {
  display: inline-flex;
  margin: 0;
  padding: 0;
}

ol.roman-lowercase {
  list-style: lower-roman inside;
}

ol.roman-uppercase {
  list-style: upper-roman inside;
}
<ol class="roman-lowercase"><li value="4"></li></ol> <!-- iv. -->
<ol class="roman-uppercase"><li value="142"></li></ol> <!-- CXLII. -->


1

function convertToRoman(num) {
    var arr = [];
    for (var i = 0; i < num.toString().length; i++) {
        arr.push(Number(num.toString().substr(i, 1)));
    }
    var romanArr = [
        ["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"]
    ];
    var roman = arr.reverse().map(function (val, i) {
        if (val === 0) {
            return "";
        }
        if (i === 3) {
            var r = "";
            for (var j = 0; j < val; j++) {
                r += romanArr[i][0];
            }
            return r;
        } else {
            return romanArr[i][val - 1];
        }
    });
    console.log(roman.reverse().join(""));
    return roman.join("");
}


convertToRoman(10);


通常情况下,如果答案包含代码的意图和解决问题的原因,而不会引入其他问题,那么这些答案会更有帮助。 - Tom Aranda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接