c# - 罗马数字到整数

标签 c# roman-numerals

在数据中,有时同一产品会以罗马数字命名,而有时则为数字。

示例 Samsung Galaxy SII 对比 Samsung Galaxy S2

如何将 II 转换为值 2

最佳答案

我注意到这里有一些非常复杂的解决方案,但这是一个非常简单的问题。我做了一个解决方案,避免了对“异常”(IV、IX、XL 等)进行硬编码的需要。我使用 for 循环来查看罗马数字字符串中的下一个字符,以查看是否应将与该数字关联的数字减去或添加到总数中。为简单起见,我假设所有输入均有效。

private static Dictionary<char, int> RomanMap = new Dictionary<char, int>()
    {
        {'I', 1},
        {'V', 5},
        {'X', 10},
        {'L', 50},
        {'C', 100},
        {'D', 500},
        {'M', 1000}
    };

public static int RomanToInteger(string roman)
{
    int number = 0;
    for (int i = 0; i < roman.Length; i++)
    {
        if (i + 1 < roman.Length && RomanMap[roman[i]] < RomanMap[roman[i + 1]])
        {
            number -= RomanMap[roman[i]];
        }
        else
        {
            number += RomanMap[roman[i]];
        }
    }
    return number;
}

我最初尝试在字符串上使用 foreach,我认为这是一个稍微更具可读性的解决方案,但我最终将每个数字相加并在后来证明它是其中之一时减去它两次异常(exception),我不喜欢。为了后代,我还是会把它贴在这里。

public static int RomanToInteger(string roman)
{
    int number = 0;
    char previousChar = roman[0];
    foreach(char currentChar in roman)
    {
        number += RomanMap[currentChar];
        if(RomanMap[previousChar] < RomanMap[currentChar])
        {
            number -= RomanMap[previousChar] * 2;
        }
        previousChar = currentChar;
    }
    return number;
}

关于c# - 罗马数字到整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14900228/

相关文章:

c# - 从 Blob 存储帐户到 CosmosDb 的复制事件非常慢

c# - SQL 或 C# 的配对速度更快吗?

c# - Fortran Dll导入

c# - system.uri' 不包含 'parsequerystring' 的定义

具有两个数组的 Java 到 Mips

c - 罗马数字转字母

c# - PowerPoint 2007 表格 : Identify Merged Cells

java - 在 Java 中将整数转换为罗马数字

php - 罗马数字转整数函数

compiler-construction - 使用语法指导的转换方案将整数转换为罗马数字?