← Назад к вопросам

Максимум двух чисел без условий

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)
  • Тестирование логики поиска максимальных значений в отчётах
  • Проверка корректности сортировки и ранжирования в системах
  • Автоматизация поиска критических метрик в мониторинге
Максимум двух чисел без условий | PrepBro