首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift中的罗马数字转换器

问Swift中的罗马数字转换器
EN

Stack Overflow用户
提问于 2020-01-18 15:08:31
回答 1查看 923关注 0票数 1

我已经编程了大约4个月了。不过,主要是JavaScript,我现在转到Swift和Java上。

我正在努力实现一个适当的for-in语句来创建一个将数字转换为罗马数字的计算器。(我在JS中做过)。

我做过的事:

variable

  • Created,
  • 创建了两个数组,
  • 创建了输入和输出
  • ,一个函数接受Int输入和字符串输出
  • 创建了一个for-in循环,通过数字

循环。

我被困的地方是在数字中循环以找到罗马数字。

代码语言:javascript
复制
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
    }    
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-18 17:16:05

我做了这个,它适用于1到4999

代码语言:javascript
复制
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年的例子:

代码语言:javascript
复制
[(rom: "M", num: 1), (rom: "CM", num: 1), (rom: "L", num: 1), (rom: "X", num: 3)]
1980 in roman is MCMLXXX

如果您想超过4999 (在这里最多可达399 999):

代码语言:javascript
复制
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)

要获得

代码语言:javascript
复制
[(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

代码语言:javascript
复制
[(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

代码语言:javascript
复制
[(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

只需将此代码封装在转换函数中,您就可以得到它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59801831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档