diff --git a/.vscode/settings.json b/.vscode/settings.json index 593e691..2315d28 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "cSpell.words": [ + "LVIII", "abcdefg", "cdefgab", "chuan", diff --git a/src/string/integer-to-roman.js b/src/string/integer-to-roman.js new file mode 100644 index 0000000..dcad04f --- /dev/null +++ b/src/string/integer-to-roman.js @@ -0,0 +1,19 @@ +/** + * @param {number} num + * @return {string} + */ +export const intToRoman = function (num) { + const nums = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1] + const chars = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'] + let result = '' + while (num) { + if (num >= nums[0]) { // 3 > 1 => 2 > 1 => 1 == 1 + result += chars[0] // I => II => III + num -= nums[0] // 3 -> 2 => 2 -> 1 => 1 => 0 + } else { + nums.shift() + chars.shift() + } + } + return result +} diff --git a/test/string/integer-to-roman.test.js b/test/string/integer-to-roman.test.js new file mode 100644 index 0000000..dea0b91 --- /dev/null +++ b/test/string/integer-to-roman.test.js @@ -0,0 +1,9 @@ +import { intToRoman } from '../../src/string/integer-to-roman' + +test('整数转罗马数字', () => { + expect(intToRoman(2)).toBe('II') + expect(intToRoman(3)).toBe('III') + expect(intToRoman(4)).toBe('IV') + expect(intToRoman(9)).toBe('IX') + expect(intToRoman(58)).toBe('LVIII') +})