Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2011, 22:51   #1
rwss gle
Заблокирован
 
Регистрация: 26.03.2011
Сообщений: 13
По умолчанию Арифметические действия с цифрами числа

Дан автобусный билет с номером, состоящим из N цифр. Расставить между цифрами знаки арифметических операций (+;-;*;/) и скобки таким образом, чтобы значение полученного выражения было равно 100. Можно образовывать многозначные числка из стоящих рядов цифр.

Как нужно сделать перебор операций, и для конкретного набора операций сделать еще перебор по порядку вычисления?
Помогите, плиз!
rwss gle вне форума Ответить с цитированием
Старый 05.04.2011, 10:10   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

"избыточная генерация"

ZZZZ....ZZ (исходное число)
X комбинация из N скобок(любых)
_ пустой оператор или "склеивание" цифр
* один из операторов +-/*_
построение комбинации(перебор всех)
X_ZX*XZX*XZX*X....XZX*XZX_
проверка на ДОПУСТИМОСТЬ(правильность).
проверка на требования (=100).

Рекурсивный перебор
(ABCZ...ZZ)

(A) + (bczz..zz)
(A) - (bczz..zz)
(A) * (bczz..zz)
(A) / (bczz..zz)
(AB) + (czz..zz)
(AB) - (czz..zz)
(AB) * (czz..zz)
(AB) / (czz..zz)
(ABC) + (zz..zz)
....
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 05.04.2011, 12:26   #3
rwss gle
Заблокирован
 
Регистрация: 26.03.2011
Сообщений: 13
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
"избыточная генерация"

ZZZZ....ZZ (исходное число)
X комбинация из N скобок(любых)
_ пустой оператор или "склеивание" цифр
* один из операторов +-/*_
построение комбинации(перебор всех)
X_ZX*XZX*XZX*X....XZX*XZX_
проверка на ДОПУСТИМОСТЬ(правильность).
проверка на требования (=100).

Рекурсивный перебор
(ABCZ...ZZ)

(A) + (bczz..zz)
(A) - (bczz..zz)
(A) * (bczz..zz)
(A) / (bczz..zz)
(AB) + (czz..zz)
(AB) - (czz..zz)
(AB) * (czz..zz)
(AB) / (czz..zz)
(ABC) + (zz..zz)
....


Можете написать краткую подобную программу?
rwss gle вне форума Ответить с цитированием
Старый 05.04.2011, 14:39   #4
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

evg_m
Мне тоже чрезвычайно интересно, не могли бы вы набросать хотя бы вчерне этот перебор через рекурсию.
BoozZzilla вне форума Ответить с цитированием
Старый 05.04.2011, 19:21   #5
rwss gle
Заблокирован
 
Регистрация: 26.03.2011
Сообщений: 13
По умолчанию

Да и я хочу понять, как пишется на программе
rwss gle вне форума Ответить с цитированием
Старый 06.04.2011, 15:28   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

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

и последнее.
ядро перебора у меня следующее:
Код:

const
  Oper : array[1..4] of string[1] = ('+', '-', '*', '/' );


procedure NextVariant(Left : string; s : string; Right : string);
var  i, k, N : integer;
  L, R, rr : string;
begin
  WriteLn(Left+' ', s, ' '+Right);

  N := Length(s);
  for i:=1 to N-1 do begin
      L := Copy(s,1,i);
      R := Copy(s,i+1,N-i);
      for k:=1 to 4 do
        NextVariant(Left,L,R+' '+Oper[k]+' '+Right);
  end;
end;

begin
  WriteLn('---');
  NextVariant('','ABCDE','');
  readln;
end.


а полностью (без перевода постфиксной формы в инфиксную!) готовая программа во вложении.
Цитата:
Код:
--------------- Digits Solver v1.0 (c) 2011 by Serge Bliznykov ---
Введите исходное число:
12345
Введите, какое значение нужно получить (0 - выдавать все варианты) :
100
 1 23 + 4 - 5 *    =      100
 1 2 * 3 + 4 * 5 *    =      100
Подбор завершён.
Вложения
Тип файла: rar perebor.rar (1.2 Кб, 74 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.04.2011, 20:05   #7
Золушка
 
Регистрация: 06.04.2011
Сообщений: 7
По умолчанию

Serge_Bliznykov, спасибо вам большое!
Золушка вне форума Ответить с цитированием
Старый 10.04.2011, 21:45   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Золушка, а вот и не за что!
К сожалению, мои опасения оправдались - код перебора работает правильно, но НЕ ВСЕ ВОЗМОЖНЫЕ операции, которые могут быть получены с помощью круглых скобок, получаются в результате моего перебора...

например,
для числа 123456 мой вышеприведённый код не найдёт решения...
т.к. решение такое (в инфиксной и в обратной польской записи):
Код:
  (1+(((2+3)+4)*(5+6))) = 100
  1 2 3 + 4 + 5 6 + * + = 100
я завтра постараюсь выложить дополненное решение...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.04.2011, 14:18   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну вот, как и обещал - новый переборщик вариантов.
Теперь вроде бы все возможные варианты расстановки скобок и знаков охвачены.

Результат (как и сам перебор) выдаётся в форме обратной польской записи.

для 123456 и числа 100 программа выдаёт следующие ответы:
Код:
 1 2   3 /+ 4   56 +* =      100
 1 2   3 + 4 + 5   6 +*+ =      100
 1 2   3   4 ++ 5   6 +*+ =      100
Подбор завершён.
Вложения
Тип файла: rar PEREB_V2.rar (10.0 Кб, 145 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.04.2011, 00:05   #10
Galtran
Новичок
Джуниор
 
Аватар для Galtran
 
Регистрация: 19.04.2011
Сообщений: 2
По умолчанию

Доброго всем вечера!

Сергей, а вас не затруднит в 2-3 словах описать алгоритм, который использовался при написании программки? Паскаль в школе был - туго вспоминается((

Насколько я понял, помимо всех возможных перестановок арифметических действий, учитываются и перестановки порядка выполнения этих самых действий.. Если вас не затруднит, на псевдо-языке опишите алгоритм?
Все может быть и быть все может. И может быть, что может быть..
Но только быть того не может, Того, чего не может быть..
Galtran вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с цифрами CrazyTosser Помощь студентам 8 07.02.2011 09:00
Арифметические действия над числами DeathWisher Помощь студентам 5 24.01.2011 19:24
Ассемблер.Арифметические действия с условием Лилея Помощь студентам 0 21.01.2011 20:23
Арифметические действия со строкой. Небесный Java Мобильная разработка (Android) 3 01.01.2011 01:41
Арифметические действия над матрицами и транспонирование Axel1981 Помощь студентам 14 12.06.2010 20:20