Попалась мне тут интересная задача перевода числа в диапазоне от 1 до 3999 из арабских цифр в римские. Простая задача оказалась не так уж и проста:)

Задача:

Семь различных символов представляют римские цифры со следующими значениями:

Символ Значение
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

Римские цифры формируются путем добавления значений десятичных разрядов от наибольшего к наименьшему. Преобразование значения десятичного разряда в римскую цифру имеет следующие правила:

1. Если значение не начинается с 4 или 9, выберите символ максимального значения, который можно вычесть из введенного числа, добавьте этот символ к результату, вычтите его значение и преобразуйте остаток в римскую цифру.

2. Если значение начинается с 4 или 9, используйте вычитаемую форму, представляющую один символ, вычитаемый из следующего символа. Например, 4 — это 1 (I) меньше 5 (V): IV, а 9 — это 1 (I) меньше 10 (X): IX. Используются только следующие вычитаемые формы: 4 (IV), 9 (IX), 40 (XL), 90 (XC), 400 (CD) и 900 (CM).

3. Только степени 10 (I, X, C, M) могут добавляться последовательно не более 3 раз для представления кратных 10. Нельзя добавлять 5 (V), 50 (L) или 500 (D) несколько раз. Если необходимо добавить символ 4 раза, используйте вычитаемую форму.


Дано целое число в диапазоне от 1 до 3999, преобразуйте его в римскую цифру.

	1 <= num <= 3999

Решение:

Сразу скажу, способов решения данной задачи несколько. Способ, которым я пытался решать был в лоб и не оптимален, плюс мое решение не учитывало цифры "4" и "9" (пропустил этот момент) и на тестах, естественно, мое решение провалилось, поэтому пошел к умному чат-боту за объяснением (все же я по образованию не программист и многих вещей могу не знать, а знать хочется).

Итак, сразу вот решение:

	function int_to_roman($num) {
    $val = [
        1000, 900, 500, 400,
        100, 90, 50, 40,
        10, 9, 5, 4,
        1
    ]; // массив, который содержит арабские значения, соответствующие римским цифрам
    $syms = [
        "M", "CM", "D", "CD",
        "C", "XC", "L", "XL",
        "X", "IX", "V", "IV",
        "I"
    ]; // массив, который содержит римские символы, которые мы будем использовать для формирования результата
    $result = "";
    for ($i = 0; $i < count($val); $i++) { // цикл проходит по всем элементам из массива значений $val
        while ($num >= $val[$i]) {// нутренний цикл while проверяет, больше ли число $num текущего значения из массива $val. Если это так, то:
                                                // - Римский символ (из массива $syms) добавляется к переменной $result.
                                                //- Значение текущего элемента из $val вычитается из числа $num. 
                                               // Это происходит до тех пор, пока $num больше или равно текущему значению.

            $result .= $syms[$i];
            $num -= $val[$i];
        }
    }
    return $result;
}

// Пример использования:
echo int_to_roman(1994);  // Вывод: MCMXCIV

Вот такое вышло простое и интересное решение :)

Количество показов: 44
06.02.2025


Реклама: ООО "Таймвеб". ИНН 7840339881. ERID: CQH36pWzJqCRJ4UXUsMHpqiAFXGXsNMKwFXHih2J7kSZMP
Реклама: ООО «КЛАУДПЭЙМЕНТС». ИНН 7708806062. ERID: CQH36pWzJqCRJ4UXeNjXpDqc5rqRHP2xLyH2ojpuzzBdYG

Разработка сайта

Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...

Сопровождение сайта

Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение

Работы по сайту

Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.