Как подготовиться к ОГЭ: алгоритмы и задачи на Python
Разбор типовых задач ОГЭ по Python
В этом разделе мы разберем несколько распространенных задач из ОГЭ по программированию на Python. Для каждой задачи приведен наиболее эффективный способ решения и альтернативные подходы с пояснениями шагов и возможных ошибок.
Как найти сумму цифр целого числа с помощью цикла и арифметических операций?
Основной эффективный способ: использование операций целочисленного деления // и взятия остатка %. Этот подход не требует преобразования числа в строку и работает непосредственно с числом.
def sum_digits_arithmetic(n):
s = 0
n = abs(n) # учитываем отрицательные числа
while n > 0:
s += n % 10
n //= 10
return s
яндекс задания python (задания от яндекса по python)
Пояснение: Функция принимает целое число n. Если число отрицательное, берем модуль. В цикле, пока n больше 0, берем последнюю цифру (n % 10) и добавляем к сумме, затем отбрасываем последнюю цифру делением на 10. Для числа 0 цикл не выполнится, поэтому в начале следует проверить: if n == 0: return 0. Альтернативно можно обработать отдельно.
Цели и случаи использования: Этот метод оптимален по скорости и не требует дополнительной памяти для строки. Подходит для больших чисел и ограниченного времени выполнения.
Типичные ошибки:
- Забыть про обработку отрицательных чисел - при n < 0 цикл while n > 0 не выполняется, сумма будет 0. Необходимо взять abs(n).
- Не проверить случай n = 0 - цикл не выполнится, вернется 0, что верно, но если не обработать abs, тоже 0.
- Использование оператора / вместо // - приведет к вещественному делению и ошибке или бесконечному циклу.
Как найти сумму цифр числа, преобразовав его в строку?
Вариант через строку: преобразуем число в строку, извлекаем символы и суммируем их числовые значения.
def sum_digits_string(n):
s = 0
for ch in str(abs(n)):
s += int(ch)
return s
Python разработчик тестовые задания (примеры тестовых заданий python)
Пояснение: str(abs(n)) превращает модуль числа в строку. Цикл по символам строки, каждый символ преобразуется в int и добавляется к сумме. Для n=0 вернется 0 (пустой цикл? Нет, строка '0' содержит один символ, s станет 0? int('0')=0, s=0, верно).
Цели и случаи использования: Этот способ нагляднее для начинающих, его легче понять. Однако требует преобразования числа в строку, что потребляет память и может быть медленнее для очень больших чисел. На ОГЭ обычно числа небольшие, поэтому способ допустим.
Ошибки: Забыть abs(n) - при отрицательном числе в строку попадет знак минус, int('-') вызовет ошибку. Также можно случайно суммировать символ '-' как int, что невозможно. Правильно: str(abs(n)).
Как проверить, является ли число простым, с помощью перебора до квадратного корня?
Эффективный способ: проверить делимость на числа от 2 до sqrt(n) (включительно). Если ни одно не делит n без остатка, число простое.
def is_prime(n):
if n < 2:
return False
i = 2
while i * i <= n:
if n % i == 0:
return False
i += 1
return True
егэ python задачи (задачи егэ по python)
Пояснение: Для чисел меньше 2 возвращаем False. Проверяем делители до sqrt(n). Если находим делитель, число составное. После цикла возвращаем True.
Цели: Это стандартный алгоритм проверки простоты для одного числа. Сложность O(sqrt(n)).
Распространенные ошибки:
- Не учесть, что 1 не является простым числом.
- Начинать проверку с 1 - приведет к ложному срабатыванию (любое число делится на 1).
- Проверять до n, а не до sqrt(n) - излишне долго.
- Не обработать случай n=2 (корректно отработает, т.к. i=2, i*i=4>2, цикл не выполнится, вернет True).
Как проверить простоту числа с помощью перебора всех делителей от 2 до n-1?
Простой, но неэффективный вариант: перебор от 2 до n-1.
def is_prime_simple(n):
if n < 2:
return False
for i in range(2, n):
if n % i == 0:
return False
return True
программы python егэ (программы для егэ по python)
Пояснение: Аналогично, но проверяет все числа до n-1. Для больших n (например, 1000000) это очень медленно.
Цели: Подходит для маленьких n или когда нужно продемонстрировать логику. На ОГЭ часто числа невелики, поэтому такой вариант тоже возможен.
Ошибки: Долгое выполнение для больших чисел. Пропуск случая n=2 - нормально.
Как подсчитать количество гласных букв в строке?
Эффективный способ: использовать множество гласных для быстрой проверки.
def count_vowels(s):
vowels = set('аеёиоуыэюя')
count = 0
for ch in s.lower():
if ch in vowels:
count += 1
return count
решу егэ python (решение заданий егэ по python)
Пояснение: Приводим строку к нижнему регистру, чтобы не различать заглавные и строчные. Множество vowels обеспечивает проверку за O(1). Цикл по символам.
Цели: Быстрый и чистый код.
Ошибки: Забыть про букву 'ё' (иногда её не включают). Не делать lower() - заглавные не будут найдены. Использовать список вместо множества - медленнее, но на малых строках не критично.
Как подсчитать гласные с помощью метода count?
Вариант с методом count: последовательно вызывать count для каждой гласной.
def count_vowels_count(s):
s = s.lower()
vowels = 'аеёиоуыэюя'
total = 0
for v in vowels:
total += s.count(v)
return total
Пояснение: Метод count проходит по всей строке для каждой гласной, что приводит к O(n * k), где k - количество гласных. Это менее эффективно, но код короче.
Цели: Подходит для коротких строк или когда нужно быстро написать решение без циклов.
Ошибки: Если не сделать lower(), count не учтет заглавные. Также забыть про 'ё'.
Дополнительные расширенные примеры
Здесь приведены более сложные или нестандартные решения, которые могут встретиться на ОГЭ или пригодятся для углубленной подготовки.
Рекурсивное нахождение суммы цифр числа
def sum_digits_rec(n):
n = abs(n)
if n < 10:
return n
return n % 10 + sum_digits_rec(n // 10)
print(sum_digits_rec(12345)) # 15
print(sum_digits_rec(-987)) # 24
15 24
Пояснение: Базовый случай - однозначное число (меньше 10) возвращает само себя. Иначе берем последнюю цифру и рекурсивно вызываем для числа без последней цифры.
Алгоритм Евклида для нахождения наибольшего общего делителя
def gcd(a, b):
while b:
a, b = b, a % b
return a
print(gcd(56, 98)) # 14
print(gcd(17, 5)) # 1
14 1
Пояснение: Используется свойство: НОД(a,b) = НОД(b, a % b). Цикл продолжается, пока b не станет 0. Эффективный способ.
Проверка строки на палиндром
def is_palindrome(s):
s = s.lower().replace(' ', '')
return s == s[::-1]
print(is_palindrome('А роза упала на лапу Азора')) # True
print(is_palindrome('Python')) # False
True False
Пояснение: Приводим к нижнему регистру, удаляем пробелы, сравниваем с перевернутой строкой. Простой и наглядный метод.
Подсчет гласных с помощью генератора списка
def count_vowels_list(s):
vowels = set('аеёиоуыэюя')
return sum(1 for ch in s.lower() if ch in vowels)
print(count_vowels_list('Привет, как дела?')) # 6
6
Пояснение: Генератор списка создает последовательность единиц для каждой гласной, sum() их суммирует. Компактный однострочник.
Решето Эратосфена для поиска всех простых чисел до N
def sieve(n):
is_prime = [True] * (n+1)
is_prime[0] = is_prime[1] = False
for i in range(2, int(n**0.5)+1):
if is_prime[i]:
for j in range(i*i, n+1, i):
is_prime[j] = False
return [i for i, prime in enumerate(is_prime) if prime]
print(sieve(30)) # [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
Пояснение: Создается список булевых значений, изначально все True. Для каждого i от 2 до sqrt(n), если i простое, вычеркиваются все кратные i начиная с i*i. В конце остаются индексы со значением True. Это эффективный способ найти все простые числа до заданного N.