Интервью qns ... Сделайте ниже без каких-либо условных или сравнения оператора - PullRequest
4 голосов
/ 18 мая 2009

Выполните следующие действия без каких-либо условий или оператора сравнения.

if (Number <= 0)
{
    Print '0';
}
else
{
    print Number;
}

спасибо ..

Ответы [ 6 ]

13 голосов
/ 18 мая 2009

Мое оригинальное простое решение:

1. print( (abs(Number)+Number) / 2 )

Это решение будет работать в большинстве случаев, если только Number не очень большой (больше половины максимального значения, например Number> = MAX_INT / 2), и в этом случае добавление может вызвать переполнение.

Следующее решение решает проблему переполнения:

2. print( (abs(Number)/2) + (Number/2) )

Однако может быть случай, когда Number является и должен оставаться целым числом, а оператор деления (/) является целочисленным делением, так что 7/2 = 3. В этом случае решение 2 не будет работать, потому что если Number = 7, оно напечатает 6 (для этого случая решение 1 будет работать просто отлично).

Так что, если нам нужно иметь дело как с большими числами, так и с целочисленной арифметикой, на помощь приходит следующее чудовище, добавляющее компенсацию для 1, которая может быть потеряна в делении на 2 в случае нечетного целого числа:

3. print( 
    ( (abs(Number)/2)+(Number/2) ) +
    ((
        (Number-(2*(Number/2))) + 
        (abs(Number)-(2*(abs(Number)/2)))
    ) / 2)
    )        
9 голосов
/ 18 мая 2009

Предположим, что число представлено 8-разрядным целым числом с добавлением двух.

Положительные числа, включая 0, имеют значение MSB, равное 0.

Для всех отрицательных чисел MSB установлен на 1.

Таким образом, мы берем дополнение MSB, расширяем его до целых 8 битов, и поразрядно И с исходным номером, например,

Положительный:

00110101 -> MSB равен 0

11111111 -> дополнение MSB расширено

00110101 -> побитовое И выше

Отрицательный:

10110101 -> MSB равен 1

00000000 -> расширенный набор MSB

00000000 -> побитовое И выше

Сравнение не требуется - я предполагаю, что побитовое И не строго сравнение.

Также, извините за отсутствие кода, но вы поняли.

9 голосов
/ 18 мая 2009
print max(0, number)
0 голосов
/ 23 мая 2009

Похоже на принятый ответ. Хотя приемлемо, когда абсолютное значение реализовано с использованием сравнений, но также более склонно к переполнению:

печать ((sqrt (Число * Число) + x) / 2);

0 голосов
/ 18 мая 2009

Я еще не видел решения, которое действительно для всего домена.

Другим решением является вызов функции, которая вызывает исключение, если входное значение равно 0 или меньше 0. Затем перехватите исключение и выведите 0.

Или вы можете использовать функцию Sign, которая возвращает -1, если вход <0, 0, если 0 и 1 в противном случае. </p>

print ((sign(x)+1) * sign(x) / 2) * x.

знак может быть -1, 0 или 1, поэтому ((знак (x) +1) * знак (x) / 2) может иметь следующие значения:

-1 -> ((-1+1)*-1)/2 = 0
 0 -> ((0+1)*0)/2 = 0
 1 -> ((1+1) * 1)/2  = 1

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

Но, на мой взгляд, оригинальная функция намного понятнее. Так зачем нарушать принцип KISS.

0 голосов
/ 18 мая 2009

Предполагая C или C ++:

switch ((unsigned long)Number & ~(unsigned long)LONG_MAX) {
    case 0:
        printf("%d\n", Number);
        break;
    default:
        printf("0\n", Number);
        break;
}

Если вы считаете switch условным оператором, попробуйте следующее:

unsigned long flag = (unsigned long)Number & ~(unsigned long)LONG_MAX;
flag /= (unsigned long)LONG_MAX + 1;
flag = 1 - flag;
printf("%d\n", Number * flag);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...