You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化阿拉伯数字转罗马数字转换器的重复代码与嵌套Switch?

优化阿拉伯数字转罗马数字的实现方案

你的代码通过嵌套switch处理不同位数的特殊值,导致逻辑大量重复。可以用统一映射表+递减遍历的方式彻底解决这个问题,代码会更简洁易维护。

优化思路

罗马数字的所有合法组合(包括4、9、40这类特殊值)都能整理成一组按数值从大到小排序的键值对。遍历这组键值对时,每次取当前数值能容纳的最大罗马值,拼接对应符号并减去该数值,循环直到原数减为0。这种方式无需区分个位/十位/百位,所有场景用同一套逻辑处理。

优化后的代码示例

// 定义所有罗马数字的数值-符号映射,按数值从大到小排序
private static readonly (int Value, string Symbol)[] RomanMappings = new[]
{
    (1000, "M"),
    (900, "CM"),
    (500, "D"),
    (400, "CD"),
    (100, "C"),
    (90, "XC"),
    (50, "L"),
    (40, "XL"),
    (10, "X"),
    (9, "IX"),
    (5, "V"),
    (4, "IV"),
    (1, "I")
};

public string ConvertNumberToRoman(int val)
{
    if (val < 1 || val > 3999)
        throw new ArgumentOutOfRangeException(nameof(val), "罗马数字仅支持1-3999的整数");

    var result = new StringBuilder();
    foreach (var (value, symbol) in RomanMappings)
    {
        while (val >= value)
        {
            result.Append(symbol);
            val -= value;
        }
    }
    return result.ToString();
}

方案优势

  • 消除重复逻辑:无需分别处理不同位数的特殊值,所有情况用同一套遍历逻辑覆盖
  • 代码更简洁:移除了嵌套switch、字符串解析数字等冗余操作
  • 易维护:调整罗马数字规则时,仅需修改RomanMappings数组,无需改动核心逻辑
  • 性能更优:避免字符串转数字的开销,直接数值比较效率更高

内容的提问来源于stack exchange,提问作者Sam Allen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:25:26