![]() |
|
Модераторы: Poseidon |
![]()
|
|
| agl |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 25.6.2006 Репутация: 3 Всего: 3 |
Задача 6
б) Вводится строка не более чем из 6 цифр и некоторое целое число R. Расставить знаки арифметических операций ("+", "-", "*", "/"; минус не является унарным, т.е. не может обозначать отрицательность числа; деление есть деление нацело, т.е. 11/3=3) и открывающие и закрывающие круглые скобки так, чтобы получить в результате вычисления получившегося выражения число R. Лишние круглые скобки ошибкой не являются. Например: Строка 505597, R=120: ((5+0)*((5*5)-(9/7)))=120. Кто-то может объяснить, как сие чудо решить? Моих мыслей практически нет, но всё же: Перебираем все возможные комбинации арифметических операций и для каждой комбинации сделать перебор всех возможных комбинаций размещения скобок, ну и вычеслить результат. В общем для меня звучит ужасно. Ещё интересный момент, при решении "подобной" задачи 6 пункт а: перебираем все возможные комбинации операторов и для каждой вычисляем результат. Вопрос: что делать, если встречаем деление на ноль? Я думаю надо считать подобную комбинацию не валидной. Это правильное решение? |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 17 Всего: 454 |
(50+5+5)*(9-7) - валидное решение?
А вообще... Количество делений строки на группы - конечно (в случае, когда каждая цифра есть самостоятельное число - вообще единично). Количество расстановок знаков между группами - конечно. Количество вариантов расстановки скобок - конечно. Следовательно, задача решаема простым перебором. Да, действительно ужасно. Но, как не крути, а варианты-то придется перебирать все. Не видать оптимизации что-то...
А альтернатива? разрешить деление на ноль? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| agl |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 25.6.2006 Репутация: 3 Всего: 3 |
Нет.
У меня и небыло сомнений насчёт решаемости задачи, проблема в нехватке знаний, чтобы написать действительно решение, а не велосипед. Я знаю как написать код для расстановок знаков между группами, а с остальным проблема. Прошо помочь информацией(названием алгоритма, ссылкой на статью и т.д.) прочитав которую можно решить данную задачу, ну или готовым кодом, если у кого завалялся(тогда лучше на С). Возможно кому то и смешно, но я просто советуюсь, т.к. больше не с кем, о правильности моего решения. Это сообщение отредактировал(а) agl - 21.3.2007, 00:09 |
||||
|
|||||
| agl |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 25.6.2006 Репутация: 3 Всего: 3 |
Неужели никто подсказать не может, что нибудь почитать для решения данной задачи? Может кто знает, что из дескретки надо прочесть?
|
|||
|
||||
| Бонифаций |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: 1 Всего: 40 |
нет. например (5+1) и (((((((((((((((((((((((((((((((((((((((5+1))))))))))))))))))))))))))))))))))))))))) и можно наращивать количество скобок бесконечно. Поэтому нельзя говорить что количество расстановок скобок конечно. Добавлено @ 16:10 Решение скажем при +-.* достаточно тривиальное решается рекурсией, проблему представляют только скобки. Я бы предложил сначала решать эту задачу с помошью польской бесскобочной записи (рекурсивно, перебором). А когда получите уже 5 0 + 5 5 * 9 7 / - * уже преобразовывать это в обычную запись со скобками. -------------------- Бонифаций. |
|||
|
||||
| agl |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 25.6.2006 Репутация: 3 Всего: 3 |
Например, решение анологичной задачи, просто без заморочек со скобками. Вроде работает, по моим тестам, и без всякой рекурсии. Алгоритм взят с сайта algolist(ссылка в моем первом посте имеется).
Задача 6. a) В написанном выражении ((((1?2)?3)?4)?5)?6 вместо каждого знака ? вставить знак одной из 4 арифметических операций +,-,*,/ так, чтобы результат вычислений равнялся 35 (при делении дробная часть в частном отбрасывается). Найти все решения.
Мне не совсем понятен ваш совет ((. Речь идет о цифрах и их организации при добавлении скобок и операторов, для нахождения всех комбинаций, которые в результате дадут заданное число Р. В любом случае спасибо, вы первый отозвались и попытались помочь советом Должен быть метод перебрать все возможные группировки данных цифр(насколько я пониманию получить все возможные группировки данных == размещению скобок), в общем путанница в голове :(( Это сообщение отредактировал(а) agl - 21.3.2007, 16:34 |
||||
|
|||||
| Бонифаций |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: 1 Всего: 40 |
нет это немного не такая задача. тут позиции скобок и операций фиксированы. Поэтому тут перебор очень простой. Добавлено @ 16:44 попробую обьяснить. Есть тн "обратная польская запись" выражений (АКА стековая запись). Она часто используется например при геренации кода. Или например в языке форт. Или в постскрипте. Ее достоинство - не нужно никаких скобок. то есть 5 + 5 записывается как 5 5 + (5+5) * (6-2) будет 5 5 + 6 2 - * и тд Если вам перебирать варианты обычной записи со скобками, то находить нужные места для скобок и следить за их балансом - дело нудное и скучное. Если искать решение в польской записи - вы просто делаете перебор чисел в нужном порядке и знаков операций (достаточно просто, особенно если учеть что многи варианты будут отсеиваться сразу - если глубина стека <2 то следующий символ не может быть операцией) . И когда получаете нужный результат - переводите из стековой записи выражения в обычную скобочную (делается элементарно) -------------------- Бонифаций. |
|||
|
||||
| agl |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 25.6.2006 Репутация: 3 Всего: 3 |
Правильно, не такая. Здесь линейное вычесление, т.е берем по порядку каждый элемент.
В задачи, которую я не могу решить, в принцепе проблема с расстоновкой скобок. Насколько я понимаю, берем текущий набор операторов(массив operators), и затем надо найти все возможные варианты размещения скобок и вычеслить с каждым вариантом расмещения скобок с текущим набором операторов. Вопрос как это сделать? Рекурсивно не рекурсивно - это второй вопрос, мне нужен толчёк - информация, которая поможет написать алгоритм. Вы считаете мне надо почитать инфу о "польской бесскобочной записи"? Если нужно - почитаю, если в интернете нормальную инфу найду. Добавлено @ 16:49
Спасибо, подумаю над вашим советом. |
|||
|
||||
| Бонифаций |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 827 Регистрация: 15.9.2005 Где: Brisbane Репутация: 1 Всего: 40 |
вот вам для затравки:
Я сделал набросок на питоне чтобы продемострировать как работает такой алгоритм. Вот резальтаты: (5 * (0 + ((5 * 5) - (9 / 7)))) (5 * ((0 + (5 * 5)) - (9 / 7))) (5 * (((0 + 5) * 5) - (9 / 7))) ((5 + 0) * ((5 * 5) - (9 / 7))) ((5 - 0) * ((5 * 5) - (9 / 7))) Вот программа. Разбирайтесь
здесь есть одна небрежность - деление на 0 у меня дает 0 (это просто лень обрабатывать эту ситуацию) так что будьте внимательнее когда будете разбираться Это сообщение отредактировал(а) Бонифаций - 21.3.2007, 17:51 -------------------- Бонифаций. |
|||
|
||||
| agl |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 65 Регистрация: 25.6.2006 Репутация: 3 Всего: 3 |
Бонифаций, спасибо БОЛЬШОЕ, попробую разобраться
|
|||
|
||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |