Как я могу проверить правильность римской цифры или нет в быстрой? [Дубликат]

Если вы используете только функцию mail(), вам нужно заполнить конфигурационный файл.

Вам нужно открыть расширение почты и установить SMTP smtp_port и т. д., и самое главное, ваше имя пользователя и пароль. Без этого почта не может быть отправлена. Кроме того, вы можете использовать класс PHPMail для отправки.

-7
задан Leo Dabus 30 April 2016 в 22:18
поделиться

2 ответа

Римские цифры не имеют однозначного соответствия десятичным разрядам. Вы написали последовательности римских цифр от 1 до 9 (одиночные десятичные цифры). Также есть римские цифры для 10, 50, 100, 500 и 1000.

Если вы хотите преобразовать большое количество в римских цифрах до десятичных знаков вам нужно разобрать его. Сначала вам нужно будет обрабатывать эти более крупные единицы.

Распечатайте на бумаге, как вы делаете преобразование самостоятельно, небольшими шагами. Затем напишите эти шаги в псевдокоде. (Не беспокойтесь о синтаксисе, просто нарисуйте шаги.)

Наконец, используйте псевдокод в качестве руководства для написания вашей программы Swift.

1
ответ дан Duncan C 21 August 2018 в 23:48
поделиться

Все, что вам нужно, - это перебрать ваши символы строки в обратном порядке и сопоставить эти значения символов. Начните с 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"
}
3
ответ дан Leo Dabus 21 August 2018 в 23:48
поделиться
  • 1
    На самом деле, я думаю, ваш подход будет работать. – Duncan C 30 April 2016 в 01:54
  • 2
    @LeoDabus Можете ли вы преобразовать это в функцию, которая принимает строку (которая будет римской цифрой)? Я действительно новичок в этом и ценю помощь! – SteveSmith 30 April 2016 в 03:35
  • 3
    Затем я сделаю правильный ответ и проголосую прямо сейчас! – SteveSmith 30 April 2016 в 03:41
  • 4
    @SteveSmith Я думаю, вы можете поместить это в функцию самостоятельно. Просто возьмите все от var result = 0 до return result и поместите это в свою функцию с параметром и измените uppercaseString etc... на [parameter_name].uppercaseString etc.... Но почему бы вам не использовать простое расширение? Что это меняет? – brimstone 30 April 2016 в 03:52
  • 5
    хорошо, проблема решена :) – vikingosegundo 30 April 2016 в 22:43
Другие вопросы по тегам:

Похожие вопросы: