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

FizzBuzz

1.7 Middle🔥 121 комментариев
#Теория тестирования#Фреймворки тестирования

Условие

Напишите программу, которая выводит числа от 1 до n. Но для чисел, кратных 3, вместо числа выводит Fizz, для кратных 5 - Buzz, а для кратных и 3, и 5 - FizzBuzz.

Пример

Вход: n = 15 Выход: 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Описание задачи

FizzBuzz - это классическая задача, которая проверяет понимание условных операторов и модульного деления. Необходимо обработать числа от 1 до n и применить специальные правила для делимости на 3 и 5.

Правила алгоритма

  1. Если число делится на 15 (на 3 И на 5) → выводим "FizzBuzz"
  2. Если число делится только на 3 → выводим "Fizz"
  3. Если число делится только на 5 → выводим "Buzz"
  4. Иначе → выводим само число

Подход 1: Классическое решение на Python

def fizzbuzz(n: int) -> list[str]:
    result = []
    
    for i in range(1, n + 1):
        if i % 15 == 0:
            result.append("FizzBuzz")
        elif i % 3 == 0:
            result.append("Fizz")
        elif i % 5 == 0:
            result.append("Buzz")
        else:
            result.append(str(i))
    
    return result

print(fizzbuzz(15))
# Выход: ['1', '2', 'Fizz', '4', 'Buzz', 'Fizz', '7', '8', 'Fizz', 'Buzz', '11', 'Fizz', '13', '14', 'FizzBuzz']

Подход 2: Элегантное решение с конкатенацией строк

def fizzbuzz_elegant(n: int) -> list[str]:
    result = []
    
    for i in range(1, n + 1):
        output = ""
        if i % 3 == 0:
            output += "Fizz"
        if i % 5 == 0:
            output += "Buzz"
        result.append(output or str(i))
    
    return result

Этот подход удобен, если нужно добавлять новые правила (например, для 7 - "Jazz"). Просто добавляем новые условия.

Подход 3: На JavaScript

function fizzbuzz(n) {
    const result = [];
    
    for (let i = 1; i <= n; i++) {
        if (i % 15 === 0) {
            result.push("FizzBuzz");
        } else if (i % 3 === 0) {
            result.push("Fizz");
        } else if (i % 5 === 0) {
            result.push("Buzz");
        } else {
            result.push(String(i));
        }
    }
    
    return result;
}

Подход 4: Вывод в консоль (для больших n)

def fizzbuzz_print(n: int) -> None:
    """Выводит результат напрямую вместо создания списка."""
    for i in range(1, n + 1):
        if i % 15 == 0:
            print("FizzBuzz", end=", ")
        elif i % 3 == 0:
            print("Fizz", end=", ")
        elif i % 5 == 0:
            print("Buzz", end=", ")
        else:
            print(i, end=", ")
    print()  # Новая строка в конце

fizzbuzz_print(15)

Анализ сложности

Временная сложность: O(n) - один проход по всем числам

Пространственная сложность: O(n) - список из n элементов

Тестирование

assert fizzbuzz(5) == ['1', '2', 'Fizz', '4', 'Buzz']
assert fizzbuzz(15) == ['1', '2', 'Fizz', '4', 'Buzz', 'Fizz', '7', '8', 'Fizz', 'Buzz', '11', 'Fizz', '13', '14', 'FizzBuzz']
assert fizzbuzz(1) == ['1']
assert fizzbuzz(3) == ['1', '2', 'Fizz']

Ключевые особенности

  • Порядок проверок важен: Проверяем делимость на 15 в первую очередь, иначе некорректно обработаем числа типа 15, 30, 45
  • Альтернативный подход: Вместо проверки на 15 можно использовать две независимые проверки (if i % 3 == 0 и if i % 5 == 0)
  • Расширяемость: Элегантный подход легче расширяется для новых правил
  • Производительность: При очень больших n предпочтителен вывод напрямую вместо создания списка
FizzBuzz | PrepBro