← Назад к вопросам
Максимум двух чисел без условий
2.0 Middle🔥 111 комментариев
#Теория тестирования
Условие
Напишите функцию, которая находит максимум из двух чисел без использования if-else и операторов сравнения.
Пример
Вход: a = 5, b = 10 Выход: 10
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение: Максимум двух чисел без условий
Описание проблемы
Нужно найти максимум между двумя числами без использования:
- if-else конструкций
- Операторов сравнения (<, >, <=, >=)
- Тернарного оператора
Это классическая задача на знание побитовых операций и арифметических трюков. Рассмотрю несколько подходов от простого к сложному.
Подход 1: Использование встроенных функций (Простейший)
def max_without_comparison(a, b):
"""
Находит максимум, используя встроенную функцию max().
Технически нет явного if-else в коде, но max() использует их внутри.
"""
return max(a, b)
Подход 2: Арифметический трюк с абсолютным значением
def max_two_numbers(a, b):
"""
Использует формулу: max(a, b) = (a + b + |a - b|) / 2
Это работает потому что:
- Если a > b: |a - b| = a - b, результат (a + b + a - b)/2 = a
- Если b > a: |a - b| = b - a, результат (a + b + b - a)/2 = b
"""
return (a + b + abs(a - b)) // 2
# Примеры
print(max_two_numbers(5, 10)) # 10
print(max_two_numbers(20, 15)) # 20
print(max_two_numbers(-5, -10)) # -5
Подход 3: Побитовые операции (Продвинутый)
def max_bitwise(a, b):
"""
Использует побитовые операции для определения разницы.
x ^ ((x ^ y) & -(x < y))
Работает в C/C++ для целых чисел, в Python требует осторожности.
"""
return a ^ ((a ^ b) & -(a < b))
Объяснение побитового подхода:
- a < b создаёт 1 (true) или 0 (false)
- -(a < b) преобразует в -1 (все биты = 1) или 0
- (a ^ b) & -(a < b) выбирает XOR разницу если b больше
- a ^ ... инвертирует результат
Подход 4: Условное выражение через bool (Хитрый)
def max_with_bool(a, b):
"""
Использует boolean как индекс массива.
(a, b)[(a, b)[0] < (a, b)[1]] вернёт больший элемент.
"""
return (b, a)[a > b] # Индекс 1 если a > b, иначе 0
# Примеры
print(max_with_bool(5, 10)) # 10
print(max_with_bool(20, 15)) # 20
Подход 5: Использование словаря (Креативный)
def max_with_dict(a, b):
"""
Используем словарь и sorted() без явных if.
"""
return sorted([a, b])[-1]
# Или с лямбдой
max_func = lambda x, y: (sorted([x, y]))[-1]
print(max_func(5, 10)) # 10
Сравнение подходов
| Подход | Читаемость | Производительность | Практичность |
|---|---|---|---|
| max() | Отлично | Хорошо | Да |
| Арифметика | Хорошо | Хорошо | Да |
| Побитовые | Плохо | Отлично | Нет |
| Bool индекс | Среднее | Хорошо | Нет |
| Sorted | Хорошо | Среднее | Нет |
Рекомендация для использования
В реальной разработке: использовать max(a, b) — это понятно, быстро и поддерживаемо.
В собеседовании: показать арифметический подход как баланс между креативностью и практичностью.
Для углубления знаний: понять побитовые операции, но знать, что они редко нужны в production коде.
Практическое применение в QA
- Валидация граничных значений (negative numbers, zeros)
- Тестирование логики поиска максимальных значений в отчётах
- Проверка корректности сортировки и ранжирования в системах
- Автоматизация поиска критических метрик в мониторинге