← 中文资源

简体中文版本

双向罗马数字转换

把 1 到 3999 的整数转换为罗马数字,并通过减法规则与规范性回环校验把合法罗马数字解析回整数。

阅读英文原文

功能说明

罗马数字转换常用于题解、章节编号和格式化输出。该实现使用从大到小的数值表处理减法组合,编码范围限定 1 到 3999;解码时逐字符累加,并在遇到小于后继符号的值时改为减法。最后通过回环编码拒绝不规范写法。

关键代码

NUMERALS 表按降序排列,包含 900、400、90、40、9、4 等减法形式。toRoman 反复减去当前值并拼接符号。fromRoman 先校验字符集,再从左到右比较相邻值,最后用 toRoman 核对结果是否与输入完全一致。

for (const [amount, symbol] of NUMERALS) {
  while (remaining >= amount) {
    output += symbol;
    remaining -= amount;
  }
}

使用注意

仅支持标准罗马数字,不接受 IIII 等非标准写法。输入必须是 1 到 3999 的整数。解码区分大小写,只接受大写字符。回环校验会增加一次编码开销,但能拒绝 IC 之类语法合法却非规范的组合。空字符串会因正则失败而抛错。

验证方式

断言 toRoman(1994) 返回 MCMXCIV,fromRoman(“MCMXCIV”) 返回 1994。toRoman(0) 与 toRoman(4000) 抛 RangeError。fromRoman(“ABC”) 抛 RangeError,fromRoman(“IIII”) 因回环不一致抛 RangeError。toRoman(4) 应返回 IV。