Превращение отрицательного числа в 0 (без if, for, max и т.д.)
Как отрицательное число превратить в 0 без if, for...
Как отрицательное число превратить в 0 без if, for...
Как отрицательное число превратить в 0 без if, for, max и других функций, используя только арифметические выражения (-, +, //, %, и т.д.)? Python
Один из простых способов: умножить число на результат сравнения. В Python x > 0 даёт True или False, а при арифметике они равны 1 и 0. Поэтому x * (x > 0) возвращает x для положительных чисел и 0 для отрицательных. Оператор сравнения здесь не является if, так что условие формально не нарушено.
Если нужно обойтись без сравнений, можно использовать битовые операции. Для целых чисел, по модулю не превышающих 2⁶³, выражение x & ~(x >> 63) работает так: для отрицательного x сдвиг даёт -1, инверсия даёт 0, и результат равен 0. Для положительного x сдвиг даёт 0, инверсия даёт -1 (все единицы), и результат равен x. Для очень больших по модулю отрицательных чисел это не сработает, поскольку x >> 63 уже не даст -1.
Какие ограничения важны для вашей задачи: нужны ли только целые числа и есть ли ограничение на диапазон значений?
Есть две оговорки. x > 0 — это сравнение, а не арифметика; если сравнения тоже запрещены, первый вариант не подходит. Битовая формула работает лишь для диапазона -2**63 <= x <= 2**63 - 1: например, при x = 2**63 + 1 она уже вернёт 2**63. В Python целые числа не ограничены 64 битами, поэтому этот способ не универсален. Вам нужно решение для произвольных целых или диапазон заранее известен?
Да, это ключевое ограничение: для произвольных int битовая формула с фиксированным сдвигом не подойдёт. Если сравнение разрешено, x * (x > 0) работает для целых любого размера; если запрещены и сравнения, и функции вроде abs, уточните, какие операции всё-таки допустимы.
Тут важно разделить два ограничения: если запрещены только if и функции, но сравнения допустимы, x * (x > 0) работает для любого Python int, включая ноль. Если запрещены и сравнения, уточните: разрешены ли битовые операции, // и %? Без точного списка операций нельзя подобрать корректное выражение.
Если * и // разрешены, сравнения тоже можно обойти: x * (1 + x // (x*x + 1)).
Для положительного x дробная часть даёт целое 0, для отрицательного — -1, поэтому множитель становится соответственно 1 или 0. При x = 0 результат и так равен нулю. Работает для целых любого размера.