LINUX.ORG.RU

Как бы вы решили

 


0

2

Даны две переменные (X,Y) в которых содержатся числа. Надо написать алгоритм после выполнения которого в X будет наименьшее значение в Y наибольшее. Можно использовать только математические функции и арифметические действия. Нельзя использовать языки программирования и вводить дополнительные переменные.


Ответ на: комментарий от Ivana

В том, что оно работает. А если кто-то решил потроллить с целочисленным делением в Си, то это его личные проблемы. В конце концов сказано же, «нельзя использовать языки программирования» )

Претензия снимается, был неправ.

andreyu ★★★★★
()
Ответ на: комментарий от f1u77y

Я считаю эту задачу антипримером хорошей программы.

Matfix
() автор топика
Ответ на: комментарий от Matfix

Лол, забудь про реальную жизнь, получай оценки, а отдельно изучай то что тебе интересно / может пригодиться.

loz ★★★★★
()
Ответ на: комментарий от Dudraug

псевдокод

код

Оно будет изоморфно записи на ЯП. Я в треде, например, не увидел ни одного ответа, который не был бы кодом на ЯП.

buddhist ★★★★★
()
Ответ на: комментарий от buddhist

имелось в виду реальные языки программирования, а не общая мат. модель. Есть блок схемы еще.

алгоритм - логика, мат. модель. Код - реализация.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Что такое «реальный язык программирования»? Если я сейчас напишу интерпретатор/компилятор (при условии, что это возможно сделать) для языка выполняющего предложенный псевдокод или блок-схему в некотором формате, этот язык будет «реальным»?

buddhist ★★★★★
()
Ответ на: комментарий от Matfix

Я вот не могу себе представить где такое может пригодится в реальной жизни.

А это зависит от того, какова будет ваша дальнейшая реальная жизнь. Но есть шанс, что мозги в ней все-таки пригодяться. Подобные задачки их в определенном направлении развивают. А с мозгами и программы писать проще, и тся/ться правильно употреблять.

Ivana
()
Ответ на: комментарий от tyakos

Если бы я с каждым самоуверенным идиотом спорил на деньги - давно был бы миллионером...

andreyu - можете ради забавы за минуту допилить мой алгоритм, чтобы работал в Си с целыми числами, это стандартная техника допиливания, применяется везде, начиная от недавно обсуждаемого Брезенхема.

Ivana
()
Ответ на: комментарий от tyakos

Ты шутишь? Он не поделил abs на 2, поэтому не работает.

Проверьте самостоятельно:

#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cfloat>

void result(float x, float y, float a, float b)
{
    bool same = fabsf((x + y) - (a + b)) < FLT_EPSILON;
    printf("x = %.1f , y = %.1f%s\n", x, y, same ? "" : " <-- wrong float");
}

void result(int x, int y, int a, int b)
{
    bool same = ((x + y) - (a + b)) == 0;
    printf("x = %.1f , y = %.1f%s\n", (float)x, (float)y, same ? "" : " <-- wrong int");
}

void sortFloat(int a, int b)
{
    float x = a * 0.1f;
    float y = b * 0.1f;
    printf("[float] a = %.1f , b = %.1f -> ", x, y);

    x = (x + y) / 2;
    y = fabsf(x - y);
    x = x - y;
    y = x + 2 * y;

    result(x, y, a * 0.1f, b * 0.1f);
}

void sortInt(int a, int b)
{
    int x = a;
    int y = b;
    printf("[int]   a = %.1f , b = %.1f -> ", (float)x, (float)y);

    x = (x + y) / 2;
    y = abs(x - y);
    x = x - y;
    y = x + 2 * y;

    result(x, y, a, b);
}

int main(void)
{
    for(int a = -3; a < 3; a++)
    {
        for(int b = -3; b < 3; b++)
        {
            sortFloat(a, b);
            sortInt(a, b);
        }
    }

    return 0;
}
andreyu ★★★★★
()
Ответ на: комментарий от buddhist

Только вот проблема - нигде не было сказано, что функция |x| определена. Любое решение, которое ее содержит, должно ее определять. Спрятать ветвление под знак модуля - о да, теперь то мы его не видим, значит его нет)))

Sqrt(x^2) также не может заменить нам |x|. Действительно, для любого Y>0 существует ровно два действительных числа x и -x такие, что x^2=(-x)^2=Y. При этом под sqrt(Y) понимается именно то из них, которое больше нуля, т.е. sqrt(Y)=x <=> (x>0 и x^2=Y). Опять появляется сравнение с нулем в определении и соответственно, скрытое ветвление в формуле.

Можно ли по условию задачи разложить модуль в ряд? Вряд ли это хорошая идея...

Кроме того, для определения знака числа нельзя пользоваться побитовыми функциями, поскольку в задаче не говорится, в какой системе счисления числа представлены, какая у них разрядность, как представляются положительные и отрицательные, и вообще ничего не говорится о том, что числа хоть как-то записаны.

Короче, вот правильное решение: http://www.programmersforum.ru/showpost.php?p=898041&postcount=15

anonymous
()
Ответ на: комментарий от anonymous

Да ладно, если нельзя использовать языки программирования, то нельзя использовать даже элементарные арифметические операции, ведь они являются подмножествами большинства ЯП.

buddhist ★★★★★
()
Ответ на: комментарий от anonymous

Опять появляется сравнение с нулем в определении и соответственно, скрытое ветвление в формуле.

Не так.

sqrt от положительного числа Х - положительное число, квадрат которого =Х. Все. Алгоритм вычисления зашит в проц. (любой, кроме мелких чипов) Там есть сравнение, но это проверка кончились-ли биты. Откуда сравнение?

anonymous
()
Ответ на: комментарий от anonymous

А ващето функции min и max вполне себе математические. Кстати, тоже м.б. зашиты в проц. (avx2: vmaxpd и vminpd), можно обойтись регистрами, без доп. переменных.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.