Как составить программу «Расставить знаки арифметических операций и скобки чтобы выполнялось равенство»?

Где то находил готовое решение, но теперь не могу найти.
Может у кого осталось.

Задача, в принципе, стандартная на перебор. Но лень матушка.
  • Вопрос задан
  • 5203 просмотра
Пригласить эксперта
Ответы на вопрос 2
Mrrl
@Mrrl
Заводчик кардиганов
Если в формулировке "расставить знаки, чтобы получить 100", то у меня осталось что-то такое:
https://www.dropbox.com/s/vktq0cllod4d34s/LuckyTic...
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
И нехилый такой переборчик получается.
В варианте "расставить знаки и скобки в левой части, чтобы выполнилось равенство":
Пусть строка цифр в левой части имеет длину n.
1. Разбить всеми возможными способами строку на числа. То есть получаем от 1 до n чисел. Количество вариантов разбиения строки из n цифр на m чисел
mwvtag8.png
2. Так как в условии сказано про скобки, то операции могут выполняться в разном порядке. Для указания порядка операций по каждому массиву из m чисел можно построить бинарное дерево, используя элементы массива как листья. Каждое дерево будет содержать m-1 вершину. Количество таких деревьев (число Каталана)
loo5xnj.png
3. Каждая из вершин задаёт одну из четырёх математических операций (+, -, *, /). Таким образом, количество возможных формул для одного дерева
kmr2zxr.png
4. Если добавить унарные минусы, то их можно раставить для каждого из m листьев
m57sarh.png
Итого вариантов
n546hm7.png
После этого обходом дерева выполняем расчёт и, если результат правильный, выводим дерево в виде выражения со скобками. Вот количество вариантов для разных n (хотя часть из них и окажется дублями или математически неверными из-за деления на 0).
+----+---------------------+---------------------+
|  n | без унарных минусов | с унарными минусами |
+----+---------------------+---------------------+
|  1 |                   1 |                   2 |
|  2 |                   5 |                  18 |
|  3 |                  41 |                 290 |
|  4 |                 320 |               5'938 |
|  5 |               5'073 |             136'770 |
|  6 |              64'469 |           3'379'794 |
|  7 |             859'385 |          87'547'746 |
|  8 |          11'853'949 |       2'345'800'050 |
|  9 |         167'763'361 |      64'477'920'386 |
| 10 |       2'422'342'053 |   1'807'930'569'874 |
+----+---------------------+---------------------+

Мне кажется, или действительно перебор? :-)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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