所以我正在构建一个示例项目,该项目采用罗马数字并将其转换为base10数字。我尝试让这个工作,但没有完成我的目标。有谁知道怎么做到这一点?我正在添加下面的10个罗马数字作为参考。谢谢!
1 - 我 2 - II 3 - III 4 - IV 5 - V. 6 - VI 7 - VII 8 - VIII 9 - IX 10 - X
答案 0 :(得分: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)
罗马数字与十进制数字没有一对一的映射关系。您绘制了从1到9(单个十进制数字)的罗马数字序列。还有10,50,100,500和1000的罗马数字。
如果要将罗马数字中的大数字转换为十进制数,则需要对其进行解析。你需要先处理那些较大的单位。
在纸上绘制出如何自行完成转换的步骤。然后用伪代码写出这些步骤。 (不要担心语法,只需绘制出步骤。)
最后,使用您的伪代码作为编写Swift程序的指南。