Не затруднит
Примите мои извинения, редко проверяю форум.
- Программу я не писал, за работоспособность не ручаюсь.
- Опечатки, в том числе и критические, не исключены
, хотя я вроде проверил.
- Формальную реализацию на языке МТ я пока оставлю вам. Алгоритм опишу на словам (немного кода будет в первом пункте).
- У вас этот момент не освещён: будем считать, что на вход подается строка вида "
", например "
"
МТ1 - переворачивает второе число задом наперёд.
Идём вправо по левому числу до плюса, состояние
. Как только натыкаемся на плюс, меняем состояние на
и начинаем работу. Передвигаемся вправо, считываем первую цифру
. Запоминаем её, помечаем штрихом, двигаемся вправо. 10 правил вида
. Идём до
или штрихованной цифры, меняем состояние на
, передвигаемся влево. Если там стоит уже штрихованная цифра, значит работа закончена. Если нештрихованная, то ставим вместо неё цифру
, которую мы заботливо несли всё это время. А эту цифру
, вместо которой мы поставили
запоминаем в
. То есть правила вида
. Дальше идём влево и действуем полностью аналогичным образом. Завершение работы, как я уже говорил, когда не останется нештрихованных цифр. Можно сразу закончить, а можно пройтись по всей строке от лямбды до лямбды, удаляя эти некрасивые штрихи.
МТ2 - добавляет недостающее число нулей к меньшему из чисел.
Тут та же самая идея со штрихами, я не буду подробно расписывать. Идея примерно такая. Начинаем с центра (с плюса), идём влево, штрихуем первую нештрихованную цифру, идём вправо, делаем аналогичную операцию. Если справа не нашлось "свободной" цифры, значит ставим 0 (штрихованный, чтобы не перепутать), и снова идем влево. Если же слева не оказалось "свободной цифры", то идём вправо и ищем свободные цифры. Если их там нет, то завершаем работу. Если они там есть, то идём влево до лямбды, ставим нуль, после чего всё повторяем. Примерно так. И в самом конце тоже нужно удалить штрихи.
МТ3 - сложение без переноса разрядов.
Тут нам и пригодится то, что числа развернуты друг к другу. Чем ближе к плюсу с обеих сторон - тем меньше разряд. Расстояние до плюса собственно и равно разряду. Как складываем? Проще простого. Идём вправо от плюса, запоминаем цифру и удаляем её, идём влево, складываем её с первой же попавшейся цифрой, её тоже удаляем, ставим на её месте результат. Повторяем, пока не останется цифр (не забываем штриховать "результатные" цифры, чтобы не перепутать с ещё не сложенными). Не забываем, что сложение у нас без переноса разрядов, то есть
,
(как в шестнадцатеричной СС, только ещё с 3 буквами).
В итоге мы получим ответ в уже правильном порядке цифр (так как пошли сначала именно вправо), но с дырками между ними. Можно их удалить, но это не принципиально (не помешает работе четвёртой МТ). А вот штрихи, как обычно, удалить нужно.
МТ4 - нормализация.
А теперь будем переносить разряды. Выполняем в один проход справа налево (в отличие от чехарды в предыдущих трёх пунктах). Если цифра больше 9, то отнимаем от неё десятку (то есть вместо
ставим
), 10 в уме, переходим на разряд влево, прибавляем. Повторяем операцию. Ничего сложного. Тут нам понадобится ещё цифра
, которая, например, понадобится при нормализации результата сложения
.
Вот собственно и всё. Правил получается не так уж и много на самом деле (особенно если считать правила
за одно, а не за сто
). Если этот монстр вам подойдёт (в чём я сомневаюсь), то отвечу на любые вопросы, связанные с написанием кодов по моему словесному описанию.