PDA

Просмотр полной версии : Задача N - хз



Fessaer
19.12.2008, 11:57
Есть две интересные задачи на создание алгоритмов.

1. Стандартный алгоритм перемены двух переменных Х и У местами состоит из

а) Z=X
b) X=Y
C) Y=Z

Грубо говоря он меняет местами значения Y и X с помощью вспомогательной переменной Z. Пример:

X=1 Y=2

a)Z=X (Z=1)
b)X=Y (X=2)
c)Y=Z (Y=1)

результат: X=2 Y=1

Первая задача состоит в том, чтобы составить алгоритм перемены значений двух переменных БЕЗ использования вспомогательных переменных.

2. Имеется функция MAX(), которая получает 3 числа и возвращает значение наибольшего из них. Пример:

MAX(1,2,3) = 3 MAX(5,8,8) = 8

Требуется составить алгоритм, который найдет из трех чисел a,b,c МИНИМАЛЬНОЕ, используя только вспомогательные переменные, математические операции и функцию MAX() и не сравнивая числа друг с другом (перевожу для программеров - "If(...) ... Else ..." и подобные вещи использовать нельзя).



Вопросы по поводу принципов составления алгоритмов мона задавать в личку.:jester:



З.Ы. Алгоритм функции MAX(a,b,c):

1) if (a>b) maximum=a
1.1) else maximum=b
2) if (c>MAX) maximum=c
3) return maximum

Алгоритм сравнивает a и b и присваивает значение большего из них
переменной maximum, затем проверяет, если с больше значения этой переменной, то присваивает ей значение с, если же нет, то оставляет ее без изменений.

Для примера возьмем числа 1, 2 и 3 :

1) 2 больше 1, значит maximum=2
2) 3 больше maximum, значит maximum=3

ILS
20.12.2008, 02:45
Проверь личку wink

Delirium Tremens
20.12.2008, 18:50
+1

Fessaer
20.12.2008, 19:17
ILS, решение верное, решению второй задачи даже приятель программер поапплодировал. У меня лично немного длиннее получилось, хотя немного проще для проверки.

Masha, вторая решена, правда с некоторыми неточностями, насчет первой выслал обьяснение.

ILS
20.12.2008, 21:38
Fessaer, я учил программирование, хотя такие задачи передо мной в ходе обучения не ставили :)

Fessaer
21.12.2008, 00:15
Merlin, решил обе. Оба решения аналогичны решениям Илса.

sirUjin
21.12.2008, 10:06
А к какому полю принадлежать числа во второй задаче? Целые, положительные, реальные?

Ryzhaya
21.12.2008, 10:29
Кинула свои варианты в личку.

Ryzhaya
21.12.2008, 10:31
sirUjin,
По традиции, если не указано иное, числа считаются целыми обычной длины, то есть Int32.

sirUjin
21.12.2008, 11:20
Если числа могут быть отрицательными, решение будет совсем другое.
А традиции... Смотря где традиции. Для програмистов на Матлабе, по традиции по умолчанию используется Double

Ryzhaya
21.12.2008, 11:47
sirUjin,
Не знаю, моё решение годится и для отрицательных чисел, и для вещественных.
На большинстве интервью, если задётся задачка на алгоритмику и не оговаривается язык, на котором должно быть решение, ожидается, что претендент напишет решение на С или С++ - их знают даже те, кто никогда не сталкивался с ними по работе, это эдакая программерская латынь.
Вещественные числа не используются по умолчанию хотя бы потому, что, например, в процессорах с 8086 по 386 они отсутствовали как данность и были выведены как функция сопроцессора (серия х87), а непосредственно в основной процессор они были добавлены только с 486.

ILS
21.12.2008, 17:12
sirUjin, есть решение, пригодное для любых чисел. Как известно, два любых действительных числа можно сравнить, и сказать, какое из них больше, а какое меньше, или признать, что они равны. Думай.

sirUjin
21.12.2008, 18:06
У меня боло решение для положительных чисел, но уже нашел для любых, при чем даже элегантнее. :)

Ryzhaya, алгоритмы, вообще-то, чаще пишутся как раз на Матлабе, потому что так легче, можно о памяти и прочем железе не думать, а заниматься непосредственно алгоритмом, а уже потом переводятся на С++. Это я тебе как человек занимающийся алгоритмами говорю :)

ILS
21.12.2008, 18:07
sirUjin, вот видишь wink

Fessaer
21.12.2008, 22:33
sirUjin, Ryzhaya, оба, обе...

Fessaer
24.12.2008, 00:31
Ответы:

1)
x = x + y
y = x - y
x = x - y

2) Самый короткий вариант:

Min = - max(-a, -b, -c)

Ryzhaya
24.12.2008, 07:50
Fessaer,
Не согласна с решением первой задачи. Всё-таки решение через XOR - более правильное, потому что ни при каких случаях не может привести к переполнению.

Fessaer
24.12.2008, 14:24
Ryzhaya,в таких ситуациях математические операции + и - предпочтительнее, так как они проще для непосвященного, а пока речь идет об алгоритме, а не о конкретной функции, понятие переполнения отсутствует.. Никто не отменял верность решения через XOR.