首页 > 解决方案 > Swift 中的罗马数字转换器

问题描述

我已经编程了大约 4 个月了。主要是 JavaScript,但是,我现在转向 Swift 和 Java。

我正在努力实现一个适当的 for-in 语句来创建一个将数字转换为罗马数字的计算器。(我已经在 J​​S 中完成了)。

我做过的事情:

我被卡住的地方是循环遍历数字以找到罗马数字

import UIKit

class ViewController: UIViewController {
    var inputNumber = 0
    var outputNumeral = ""

    var numberValue = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]
    var romanNumeral = [
      "M",
      "CM",
      "D",
      "CD",
      "C",
      "XC",
      "L",
      "XL",
      "X",
      "IX",
      "V",
      "IV",
      "I"
    ]

    func converter(inputNumber: Int) -> String {
        for numb in numberValue {
            while numberValue[0] < numb {
                romanNumeral + outputNumeral
                numb - numberValue[0]
            }
        }

        return outputNumeral
    }    
}

标签: arraysswiftswift5roman-numerals

解决方案


我这样做了,适用于 1 到 4999

let initial = 1980
var val = initial
var countForRoman : [(rom: String, num: Int)] = []    // how many occurences of romanNumbers; don't use dictionaries as not ordered

for (index, number) in numberValue.enumerated() {
    let x = val / number
    if x > 0 {
        countForRoman.append((romanNumeral[index], x))
        val = val - x * number
    }
}
print(countForRoman)    // Just to see how it converted

var romanString = ""
for pairs in countForRoman {
    let iter = pairs.num
    for _ in 1 ... iter { romanString += pairs.rom }
}

print(initial, "in roman is", romanString)

以 1980 年为例:

[(rom: "M", num: 1), (rom: "CM", num: 1), (rom: "L", num: 1), (rom: "X", num: 3)]
1980 in roman is MCMLXXX

如果您想超过 4999(此处为 399 999):

var numberValue = [100_000, 90_000, 50_000, 40_000, 10_000, 9000, 5000, 4000, 1000,900,500,400,100,90,50,40,10,9,5,4,1]
var romanNumeral = [
    "(C)",
    "(X)(C)",
    "(L)",
    "(X)(L)",
    "(X)",
    "M(X)",
    "(V)",
    "M(V)",
    "M",
    "CM",
    "D",
    "CD",
    "C",
    "XC",
    "L",
    "XL",
    "X",
    "IX",
    "V",
    "IV",
    "I"
]


let initial = 9999
var val = initial
var countForRoman : [(rom: String, num: Int)] = []    // how many occurences of romanNumbers; don't use dictionaries as not ordered

for (index, number) in numberValue.enumerated() {
    let x = val / number
    if x > 0 {
        countForRoman.append((romanNumeral[index], x))
        val = val - x * number
    }
}
print(countForRoman)    // Just to see how it converted

var romanString = ""
for pairs in countForRoman {
    let iter = pairs.num
    for _ in 1 ... iter { romanString += pairs.rom }
}

print(initial, "in roman is", romanString)

要得到

[(rom: "M(X)", num: 1), (rom: "CM", num: 1), (rom: "XC", num: 1), (rom: "IX", num: 1)]
9999 in roman is M(X)CMXCIX

对于 39999

[(rom: "(X)", num: 3), (rom: "M(X)", num: 1), (rom: "CM", num: 1), (rom: "XC", num: 1), (rom: "IX", num: 1)]
39999 in roman is (X)(X)(X)M(X)CMXCIX

对于 129_999

[(rom: "(C)", num: 1), (rom: "(X)", num: 2), (rom: "M(X)", num: 1), (rom: "CM", num: 1), (rom: "XC", num: 1), (rom: "IX", num: 1)]
129999 in roman is (C)(X)(X)M(X)CMXCIX

只需将此代码封装在转换函数中即可。


推荐阅读