如何获取罗马数字字符串并将其转换为base10数字? [关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取罗马数字字符串并将其转换为base10数字? [关闭]相关的知识,希望对你有一定的参考价值。

所以我正在构建一个示例项目,该项目采用罗马数字并将其转换为base10数字。我尝试让这个工作,但没有完成我的目标。有谁知道怎么做到这一点?我正在添加下面的10个罗马数字作为参考。谢谢!

1 - I 2 - II 3 - III 4 - IV 5 - V 6 - VI 7 - VII 8 - VIII 9 - IX 10 - X

答案

您所需要的只是以相反的方式遍历您的罗马字符串字符并映射这些字符值。从maxValue等于零开始,切换字母值,将其保存为maxValue,如果值等于maxValue,则添加它,否则减去实际值。你也可以使用regex(严格或不严格)来验证并在失败时抛出错误。试试这样:

Xcode 9.x•Swift 4.x

注意:对于Swift 3版本或更早版本,请检查编辑历史记录。

extension String {
    enum RomanParsingError: Error {
        case invalidNumber
    }
    func romanNumeralValue() throws -> Int  {
        guard range(of: "^(?=[MDCLXVI])M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$", options: .regularExpression) != nil else {
            throw RomanParsingError.invalidNumber
        }
        var result = 0
        var maxValue = 0
        uppercased().reversed().forEach {
            let value: Int
            switch $0 {
            case "M":
                value = 1000
            case "D":
                value = 500
            case "C":
                value = 100
            case "L":
                value = 50
            case "X":
                value = 10
            case "V":
                value = 5
            case "I":
                value = 1
            default:
                value = 0
            }
            maxValue = max(value, maxValue)
            result += value == maxValue ? value : -value
        }
        return result
    }
}

用法:

do {
    let decimal = try "MCMLXXVIII".romanNumeralValue()
    print(decimal)   // 1978
} catch {
    print(error)
}


do {
    let decimal = try "IIIV".romanNumeralValue()
    print(decimal)
} catch {
    print(error)   // "invalidNumber
"
}
另一答案

罗马数字没有与十进制数字的一对一映射。您绘制了从1到9(单个十进制数字)的罗马数字序列。还有10,50,100,500和1000的罗马数字。

如果要将罗马数字中的大数字转换为十进制数,则需要对其进行解析。你需要先处理那些较大的单位。

在纸上绘制出如何自行完成转换的步骤。然后用伪代码写出这些步骤。 (不要担心语法,只需绘制出步骤。)

最后,使用您的伪代码作为编写Swift程序的指南。

以上是关于如何获取罗马数字字符串并将其转换为base10数字? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

powershell SharePoint PowerShell,它获取作为字符串的列表项并将其转换为数字,然后更新列表项。

如何将base64图像转换为图像并将其保存到文件系统[重复]

批量生成IPv6 subnet地址

批量生成IPv6 host地址

批量生成IPv6 range地址

10个适合新手的人工智能项目 - 02手写数字识别:使用Python和机器学习算法,编写一个手写数字识别程序,能够识别手写数字图像并将其转换为数字。