← Назад к вопросам
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.
Правила алгоритма
- Если число делится на 15 (на 3 И на 5) → выводим "FizzBuzz"
- Если число делится только на 3 → выводим "Fizz"
- Если число делится только на 5 → выводим "Buzz"
- Иначе → выводим само число
Подход 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 предпочтителен вывод напрямую вместо создания списка