✅ Решения заданий

⚠️ Рекомендация: попробуйте решить задания самостоятельно, прежде чем смотреть ответы. Решения — это последняя инстанция, когда собственные попытки исчерпаны.

Решение задания 1: Найди делители

📄 task_01_divisors.py
number = int(input("Введите число: "))
candidate = 1

print("Делители числа: ", end="")
while candidate <= number:
    if number % candidate == 0:
        print(candidate, end="")
        if candidate != number:
            print(", ", end="")
    candidate += 1
print()

Логика решения: переменная candidate перебирает числа от 1 до number. Если number делится на candidate без остатка, это делитель. Запятая после числа не печатается для последнего делителя.

Решение задания 2: Простые числа

📄 task_02_primes.py
import math

limit = int(input("Введите число: "))
current = 2
first = True

print("Простые числа: ", end="")
while current <= limit:
    is_prime = True
    divisor = 2
    while divisor <= int(math.isqrt(current)):
        if current % divisor == 0:
            is_prime = False
            break
        divisor += 1

    if is_prime:
        if not first:
            print(", ", end="")
        print(current, end="")
        first = False

    current += 1
print()

Логика решения: внешний цикл перебирает числа от 2 до N. Внутренний цикл проверяет делимость от 2 до квадратного корня из текущего числа. Если делитель найден, число составное. В Python 3.8+ math.isqrt возвращает целую часть корня.

💡 Альтернатива: если math.isqrt ещё не изучался, можно заменить int(math.sqrt(current)).

Решение задания 3: Найди подстроку

📄 task_03_find_python.py
text = input("Введите строку: ")
print(f"Содержит 'Python': {'Python' in text}")

Логика решения: оператор in проверяет вхождение подстроки. Результат — True или False.

Версия через цикл и срезы:

📄 task_03_find_python_loop.py
text = input("Введите строку: ")
target = "Python"
lower_text = text.lower()
lower_target = target.lower()

found = False
index = 0
while index <= len(lower_text) - len(lower_target):
    if lower_text[index:index + len(lower_target)] == lower_target:
        found = True
        break
    index += 1

print(f"Содержит '{target}': {found}")

Логика решения: цикл сравнивает подстроки длины target, начиная с каждой позиции. При совпадении цикл прерывается через break. Регистр приведён к нижнему для поиска без учёта регистра.

Решение дополнительного задания: случайная строка

📄 task_04_random_string.py
import random

letters = "abcdefghijklmnopqrstuvwxyz"
result = ""
length = 10
index = 0

while index < length:
    result += random.choice(letters)
    index += 1

print(f"Random string: {result}")

Логика решения: цикл добавляет случайную букву к строке result до достижения нужной длины. Поскольку строки неизменяемы, каждое сложение создаёт новую строку.