Higher
|
||||||
1 | ||||||
Нужно расставить между числами знаки + или - таким образом, чтобы получилось выражение, значение которого равно s и вывести его на экран04.07.2011, 16:47. Показов 15415. Ответов 19
Метки нет (Все метки)
Доброго времени суток
Задание: дано n чисел и число s. Нужно расставить между числами знаки + или - таким образом, чтобы получилось выражение, значение которого равно s и вывести его на экран. Если это невозможно - вывести "No solution". Полное условие тут. Пример: input.txt: 3 10 (n = 3) 15 25 30 output.txt: 15+25-30=10 Рекурсию под эту задачу я вроде как сделал, считает различные суммы, но как вывести выражение - не могу додуматься. Хранить его вроде как негде, строка будет засорятся, да и загнать это выражение в строку проблематично будет... Либо можно вывести весь массив до n, но где взять знаки... Думаю, что нужно поставить какое-то условие в рекурсию, чтобы при его выполнении она выводила число, знак и завершала один вызов, и так пока не выведет все выражение. Но как это сделать слабо представляю.
0
|
04.07.2011, 16:47 | |
Ответы с готовыми решениями:
19
Расставить между числами знаки "+" и "-" так, чтобы значение выражение стало равно S Расставить между данными числами знаки +/-, чтобы значение получившегося выражения было равно заданному целому S Между заданными числами расставить знаки сложения и вычитания так, чтобы в итоге получилось указанное число Расставить между числами знаки "+" и "-" так, чтобы значение получившегося выражения было равно заданному целому S |
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
|
|||||||||||
04.07.2011, 17:14 | 2 | ||||||||||
По моему здесь проблема с рекурсией всётаки. Ведь вы углубляетесь в рекурсию не сохраняя, плюс или минус был выбран в данной ветке... из суммы это не может следовать однозначно. Нужно ещё один параметр, скажем char sign, и углубление будет выглядеть так:
1
|
Higher
|
|||||||||||
04.07.2011, 18:07 [ТС] | 3 | ||||||||||
Да, я делал также, даже переменную также обозвал =)
Получилось нечто такое
Да и глобальная переменная мне совсем не нравится. Плюс иду я с конца и на каждом числе идет вызов рекурсии, т.е. в потолок упираться буду достаточно много раз. В общем не хватает только условия для 10 строки, если ветка правильная, то выводить.
0
|
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
|
04.07.2011, 18:53 | 4 |
А я наоборот при решении олимпиадных задач часто ими пользуюсь. Кстати я заметил что Вы любитель писать самые короткие коды. Тогда один из методов сокращения кода - это использование глобальных переменных (в параметрах функции ее не нужно будет передовать).
Кстати могу показать свое решение этой задачи, если не осилите свое.
0
|
Higher
|
|
04.07.2011, 19:02 [ТС] | 5 |
Я знаю, но это считается плохим стилем =)
Сначала решу по нормальному, потому начну быдлокодить. Иначе просто не пойму как все это работает и не смогу достаточно оптимизировать код. Да и не такой уж я и любитель, только два первых места =) Ну и в этой задаче я явно буду первым, здесь первое место 320 символов, вполне реально. Да осилю рано или поздно, я настойчивый... Мне только алгоритм нужен. Сейчас завел массив знаков, с некоторыми багами, но вроде работает... А хочется красивый выход из рекурсии >_<
0
|
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
|
||||||
04.07.2011, 20:12 | 6 | |||||
Не по теме: а свой быдлокод с глобальными переменными писать можно?
1
|
Higher
|
|
04.07.2011, 20:21 [ТС] | 7 |
У меня похоже получилось, но вместо глобальной переменной я таскал за собой указатель на массив в аргументе...
Однако у меня есть какой-то баг, который я не могу выловить - правильно выводит знаки далеко не всегда. А трассировать рекурсию я не умею, тупо путаюсь >_< P.S. зачем писать extern? Массив ведь и из функций виден. P.P.S. напишу завтра с нуля...
1
|
101 / 88 / 7
Регистрация: 17.12.2010
Сообщений: 416
|
||||||
04.07.2011, 20:31 | 8 | |||||
просто хотел объявить массив. без объявления как то некрасиво. очевидно, что
0
|
Higher
|
||||||
05.07.2011, 16:53 [ТС] | 9 | |||||
Ну так можно вообще его в функциях не объявлять, и так работать будет =) Ну или для наглядность писать еще ::znaki .
Часов 6 убил, но так и не смог выловить баг...
15+25-30=10 выводит, а вот при n = 3, s = 0 и числах 3 6 3 выводит 3-6-3=0. Что странно, пробовал с глобальным флагом как в #3 делать, ошибка была точно такой-же. Могу зайти под пингвином и соответствующий код скинуть...
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
05.07.2011, 16:57 | 10 |
0
|
Higher
|
||||||
05.07.2011, 16:58 [ТС] | 11 | |||||
Так и есть. Так удобнее просто =) И в идеале я хочу заставить работать этот код
Что странно, ошибка в обоих кодах одна и та же.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
05.07.2011, 17:01 | 12 |
Ну так справа налево оба варианта корректные
15+(25-30)=10 3-(6-3)=0
1
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
05.07.2011, 17:08 | 14 |
Операция сложения ассоциативна, её можно выполнять в любом порядке.
Операция вычитания ассоциативной не является. То есть либо рассматривать числа как отрицательные и положительные и использовать только сложение, либо, если числа только неотрицательные, при использовании вычитания менять все последующие знаки.
1
|
Higher
|
||||||
06.07.2011, 11:41 [ТС] | 15 | |||||
В общем рекурсия вообще кривая какая-то у меня получилась, так что я забил на нее...
Решил через двоичную систему =) Как ни странно, в книге Меньшикова написано, что такое решение не будет проходить по времени. Однако же прошло за 0.97 =)
0
|
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
|
|
06.07.2011, 11:57 | 16 |
блин! я вчера ночью нашел у себя решение этой задачки великолепное... чёт не знаю чего сюда не кинул...
0
|
no0ker
|
06.07.2011, 15:29
#18
|
0
|
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
|
||||||
06.07.2011, 18:00 | 19 | |||||
Добавлено через 52 минуты кстати, там знак передаётся но он таки не нужен... просто рудимент...
2
|
Higher
|
|
06.07.2011, 18:08 [ТС] | 20 |
Угу... Правда там вывод немного не соответствует формату(перед первым числом не может быть знака),
но это исправить не сложно. Спасибо за решение, вроде разобрался...
0
|
06.07.2011, 18:08 | |
06.07.2011, 18:08 | |
Помогаю со студенческими работами здесь
20
Расставить знаки между цифрами чтобы получилось 100 Заданы цифры - расставить знаки сложения и вычитания так, чтобы получилось выражение с заданным результатом Заданы цифры - расставить знаки сложения и вычитания так, чтобы получилось выражение с заданным результатом Расставить знаки между цифрами так, чтобы получилось заданное число Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |