Выбор из трех чисел.(без кучи if)

Алгоритмы: от сортировки пузырьком до численных методов

Модераторы: C_O_D_E, DeeJayC

lampa
Сообщения: 5
Зарегистрирован: 31 мар 2008, 00:07

31 мар 2008, 00:11

нужна простои алгоритм, без кучи if
даны три числа a,b,c из них надо выбрать число так что бы оно было посередине!
например a<b<c так метод возвращает b
Serge_Bliznykov
Сообщения: 366
Зарегистрирован: 31 авг 2007, 03:06

31 мар 2008, 01:10

А три IF это уже куча?.. ;-)

Код: Выделить всё

if a<b then begin
  if b<c then Result := b
  else Result := c
end
else
  if a<c then Result := a
  else Result := c;
lampa
Сообщения: 5
Зарегистрирован: 31 мар 2008, 00:07

31 мар 2008, 01:59

Spasibo no eto ne pravel'no!!
Na samom dele tam namnogo bol'she if
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

31 мар 2008, 09:12

матан учить надо
число=[(a+b+abs(a-b))/2+c-abs((a+b+abs(a-b))/2-c)]/2
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

31 мар 2008, 10:17

вариант без if получается слишком большим арифметическим выражением, если очень надо напишу
lampa
Сообщения: 5
Зарегистрирован: 31 мар 2008, 00:07

31 мар 2008, 12:04

Eto ne pravel'no ecli a=8,b=4,c=1
to result=1;
Serge_Bliznykov
Сообщения: 366
Зарегистрирован: 31 авг 2007, 03:06

31 мар 2008, 16:34

да, Вы правы - моё решение неверно!!!
а если в одном if написать несколько условий через and/or это будет "честным" решением?.. тогда можно в два if вложится... ;-)
lampa
Сообщения: 5
Зарегистрирован: 31 мар 2008, 00:07

31 мар 2008, 16:45

A kak ???
Vi mne pomogete esli odskagete :)
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

31 мар 2008, 16:53

безо всяких условий чистая математика
max=(a+b+abs(a-b))/2
min=(a+b-abs(a-b))/2

cped=max(min(a,b),min(a,c),min(b,c))

уж распишите сами, времени нет :)
Medved
Сообщения: 250
Зарегистрирован: 14 фев 2008, 20:51
Контактная информация:

31 мар 2008, 17:03

Можно так:
[syntax='Pascal']
Program SearchMiddle;
Type Arr=Array[0..4] Of Integer;
Var A:Arr;

Begin
Writeln('Enter A,B,C:');
Readln(A[1],A[2],A[3]);
I:=1;K:=False;
A[0]:=A[3];A[4]:=A[1];
While Not K Do
Begin
K:=(A<=A[ i +1])And(A>=A[I-1])or(A>=A[ i +1])And(A<=A[I-1]);
Inc(I);
End;
Writeln(A[i-1]);
End.
[/syntax]
Лёгкий, не правда ли? И без ИФОВ.
Ваши руки совершили идиотскую ошибку и будут оторваны!
[OK]
Ответить