IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Арифметические действия
сообщение
Сообщение #1


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Сестра убиралась у себя в шкафу и нашла книгу которую я искалпол года, сборник олипиадных задача 80-х годов smile.gif Вот стал решать там все подрят, собственно задача :

В написании выражения ((((1?2)?3)?4)?5?)?6 вместо каждого знака ? вставить знак одного из 4-х арифметическихвыражений : +, -, *, / так, чтобы результат вычислений равнялся 35 (при делении дробная часть отбрасывается) Достаточно найти одно решение.

Мое решение оказалосб менше и понятней для меня чем решение приведенное в книге, но может кто придложет еще более комактный вариант ;)

uses crt;
var
a_1,a_2 : integer;

function calculate(a,b : integer; ch : char) : integer;
begin
case ch of
'+' : calculate := a + b;
'-' : calculate := a - b;
'*' : calculate := a * b;
'/' : calculate := a div b;
end;
end;

var
c : array[1..4] of char = ('+','-','*','/');
c1, c2, c3, c4, c5 : byte;

begin
clrscr;
for c1 := 1 to 4 do
for c2 := 1 to 4 do
for c3 := 1 to 4 do
for c4 := 1 to 4 do
for c5 := 1 to 4 do begin
a_1 := 1;
a_2 := 2;
a_1 := calculate(a_1,a_2,c[c1]);
inc(a_2);
a_1 := calculate(a_1,a_2,c[c2]);
inc(a_2);
a_1 := calculate(a_1,a_2,c[c3]);
inc(a_2);
a_1 := calculate(a_1,a_2,c[c4]);
inc(a_2);
a_1 := calculate(a_1,a_2,c[c5]);
if a_1 = 35 then begin
writeln(c[c1],' ',c[c2],' ',c[c3],' ',c[c4],' ',c[c5]);
halt;
end;
end;
end.


чувствую что можно это все еще сократить, но пока не получается ..

буду выклывадывать интересные задачки, если етсь желающие мозги размять smile.gif

Сообщение отредактировано: volvo -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






По-моему, у тебя не все результаты находятся... Моя программа нашла 3 возможных варианта:
uses crt;

function oper(a, b: integer; ch: char): integer;
begin
case ch of
'+' : oper := a + b;
'-' : oper := a - b;
'*' : oper := a * b;
'/' : oper := a div b;
end;
end;

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

procedure calculate(s: string);
var res, i: integer;
begin
if length(s) = 5 then begin

res := 1;
for i := 1 to 5 do
res := oper(res, i+1, s[i]);

if res = 35 then begin
for i := 1 to 5 do write(s[i]:3);
writeln
end;
end

else
for i := 1 to 4 do
calculate(s + op[i]);
end;

begin
calculate('');
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


У меня просто после нахождения первого решение происходит выход из программы, можно и убрать.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Я тоже решил поупражняться в краткости. И вот что у меня получилось:
var
a,i,j:integer;
s:string;

begin
for i:=0 to 1023 do begin
a:=1;
s:='';
for j:=2 to 6 do begin
case i shr ((j-2)*2) and 3 of
0:begin a:=a+j; s:=s+'+ ' end;
1:begin a:=a-j; s:=s+'- ' end;
2:begin a:=a*j; s:=s+'* ' end;
3:begin a:=a div j; s:=s+'/ ' end;
end;
end;
if a=35 then WriteLn(s)
end
end.

Тоже находит три варианта, выход после нахождения первого я делать не стал - так короче smile.gif, да вроде оно и не требуется..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 1.09.2025 18:13
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name