11:41

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
Задачку интересную углядела, утаскиваю к себе.
Есть функция с прототипом int Max(int a,int b,int c). Возвращает, соответственно, наибольший из параметров. Даны 3 целых числа. Необходимо с помощью данной функции Max, неограниченного количества воспомогательных переменных и арифметических операций найти наименьшее из них. Условными операторами, операциями сравнения, а так же тетрарным оператором пользоваться нельзя.

@темы: Программизм

Комментарии
21.12.2008 в 13:56

ΔX/ΔT
для неотрицательных чисел

int max(a, b){
return (a+b-mod(a-b))/2;
}

int max(a, b, c){
return max(max(a,b),max(b,c));
}

при добавлении отрицательных нужно добавить ещё один модуль
21.12.2008 в 14:08

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
ymik
Нет, ты не понял задание. Есть функция возвращающая максимальное из трёх чисел. Надо с помощью этой функции найти минимальное из трёх чисел, не пользуясь условными операторами.
21.12.2008 в 14:41

ΔX/ΔT
Караидель ок. Смотрим так: наименьшее из 3х чисел находится? Находится. Условные опервторы не используются? Не используются. Задача решена? Решена, без ф-ии max. Она тут просто не требуется.
21.12.2008 в 14:42

ΔX/ΔT
хотя, несомненно, можно несколько усложнить алгоритм, заменив взятие модуля (mod) на компажн операцию с помощью max.
21.12.2008 в 14:50

ΔX/ΔT
int mod(a){
return max(a, 0, -a);
}

int min(a, b){
return (a+b-mod(a-b))/2;
}

int min(a, b, c){
max(max(a,b),max(b,c));
}
21.12.2008 в 14:51

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
ymik
Да, но взятие модуля не является базовой арифметической операцией.
21.12.2008 в 14:57

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
ymik
ОК, так годится.
21.12.2008 в 15:04

ΔX/ΔT
Караидель вообще-то является, поскольку вычитание определяется через операцию модуля (если определять операции через системы аксиом Пиано).
21.12.2008 в 15:09

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
ymik
Я имела в виду для языков программирования.
21.12.2008 в 15:58

ΔX/ΔT
Караидель для языков программирования - тем более является... собственно вспомни хранение числа в памяти
21.12.2008 в 16:13

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
ymik
А при чём здесь хранение числа в памяти? Обнулением первого бита значение по модулю не получишь. В асме, кстати, тоже нет операции взятия модуля за одно действие, есть только NEG.
21.12.2008 в 22:28

Что-то никак не пойму где подвох:
-Max(-a,-b,-c)
чем плох?

meharher
21.12.2008 в 22:58

149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
Гость
Охренеть... Гениальное решение! Честно, даже в голову не пришло.