Помощь - Поиск - Пользователи - Календарь
Полная версия: Арифметические действия
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
klem4
Сестра убиралась у себя в шкафу и нашла книгу которую я искалпол года, сборник олипиадных задача 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
По-моему, у тебя не все результаты находятся... Моя программа нашла 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.
klem4
У меня просто после нахождения первого решение происходит выход из программы, можно и убрать.
Lapp
Я тоже решил поупражняться в краткости. И вот что у меня получилось:
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, да вроде оно и не требуется..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.