Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > помогите решить задачу


Автор: Leere 18.9.2005, 19:21
записать на Си выражение, истинное при выполнении указанного условия и ложное в противном случае, если только одно из чисел x, y, z положительно.
Заранее спасибо.
Очень срочно.

Автор: Mayk 18.9.2005, 19:30
Решение в лоб:
Код

((x>0) && (y<=0) && (z<=0)) ||
((y>0) && (x<=0) && (z<=0)) ||
((z>0) && (y<=0) && (x<=0)))


Решение для настоящих извращенцев:
Код

    int a,b,c;
    a=-1;    b=1;    c=0;
    bool r = ((a >> 31) + ( b >>31 ) + (c >> 31)  // минус кол-во отрицательных чисел
        - (a == 0) - (b == 0) - (c == 0)) //минус кол-ва нулей
        == -2; //кол-во не положительных чисел == 2

    cout<<r;


Кол-во операций во втором вроде меньше smile
(в первом 9 операций сравнения и 6 AND'ов и 2 OR'а. 9+6+2=17. Во втором 3 сдвига, 2 сложения, 3 вычитания, одно сравнение. 3+2+3+1=9 smile))))
Добавлено @ 19:37
Вот еще можно. ((a > 0) + (b > 0) + (c > 0) == 1) - кол-во положительных чисел равно 1 smile

Автор: bel_nikita 18.9.2005, 21:14
Так можно проверить самый старший бит. Если он в единице - отрицательное число smile

Вот, примерчик при условии, что sizeof(int) равно 4 байта:
Код

bool IsNegativeNumber( int ix ) { return ix & 0x80000000 ? true : false; }

bool SomeFunctuion( int x, int y, int z )
{
 return !( IsNegativeNumber( x ) || IsNegativeNumber( y ) || IsNegativeNumber( z )  );
}


З.Ы.: можно конечно IsNegativeNumber через шаблон написан, но автору топика я думаю и этого будет достаточно

Автор: Mayk 18.9.2005, 21:18
Возможна загвоздка - 0 не является положительным числом в строгом смысле(во всяком случае различают понятия неотрицательное число и положительное число).
Хотя с другой стороны во флоатах существуют положительные и отрицательные нули.

Автор: Romikgy 19.9.2005, 09:28
Код

bool Otvet(int x, int y, int z) { return ((x>>31) & (y>>31) & (z>>31));}

Автор: Leere 20.9.2005, 11:01
2Mayk, 2 bel nikita : Пасибо, вы меня спасли от недопуска к лабораторке!

Автор: sergejzr 20.9.2005, 20:21
Тема перенесена из С++

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)