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

问题描述 投票:-6回答:2

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

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

ios string swift math
2个回答
5
投票

您所需要的只是以相反的方式遍历您的罗马字符串字符并映射这些字符值。从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\n"
}

1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.