- разбирать число на цифры с помощью
n % 10иn // 10и находить сумму, произведение, количество цифр и перевёрнутое число - считать и складывать делители, проверять, является ли число простым или полным квадратом
- вычислять НОД и НОК алгоритмом Евклида, а суммы вида 1 + 1/2 + … + 1/n — циклом
- проверять все числа отрезка вложенными циклами и узнавать готовые шаблоны в заданиях ГЭЦ
Правильно ли набран номер банковской карты? Алгоритм проверки разбирает номер по цифрам, складывает их и смотрит на остаток. В каждом варианте ГЭЦ по информатике 3–4 задания относятся к теме «Оператор цикла. Операции над числами», а в трёх вариантах из четырёх (2025–2026) одна из письменных программ тоже была по этой теме. Хорошая новость: почти все такие задания собираются из нескольких готовых шаблонов — цикла по цифрам, цикла по делителям и алгоритма Евклида. Этот урок продолжает урок «Операторы цикла: for, while, шаг цикла, break, continue и вложенные циклы».
Выделение цифр: n % 10 и n // 10
В десятичной системе последняя цифра числа — это остаток от деления на 10, а целочисленное деление на 10 отбрасывает эту цифру: 5682 % 10 = 2, 5682 // 10 = 568. Если повторять эти два действия в цикле, цифры будут появляться по одной справа налево; когда число станет равно 0, цифры закончатся.
- dпоследняя цифра (0…9)
- %остаток от деления
- //целочисленное деление: дробная часть отбрасывается, число становится на одну цифру короче
Две главные команды цикла по цифрам. Цикл работает с условием while n > 0:.
- n // pow(10, k) % 10k-я цифра справа (k = 0 — единицы, 1 — десятки, 2 — сотни)
- n % pow(10, k)число из последних k цифр
- n // pow(10, k)число, оставшееся после отбрасывания последних k цифр
Любую цифру можно взять и без цикла: 5682 // 100 % 10 = 6, 5682 % 100 = 82, 5682 // 1000 = 5.
Вычислите: 1) 7049 % 10 и 7049 // 10; 2) цифру десятков и цифру сотен числа 7049; 3) 30 % 10 и 30 // 10.
Показать решениеСкрыть решение
2) Десятки: 7049 // 10 % 10 = 704 % 10 = 4. Сотни: 7049 // 100 % 10 = 70 % 10 = 0.
3) 30 % 10 = 0, 30 // 10 = 3. Последняя цифра может быть 0 — цикл по цифрам учитывает и её.
- 1Сохрани копию
В цикле n изменится и станет 0. Если исходное число понадобится потом, сначала запиши
m = n. - 2Начальные значения
сумма
s = 0, произведениеp = 1, количествоc = 0, перевёрнутое числоr = 0. - 3Условие цикла
while n > 0:— пока остаются цифры. - 4Возьми цифру и обработай её
d = n % 10, затемs = s + d,p = p * d,c = c + 1,r = r * 10 + dили условие, напримерif d % 2 == 0:. - 5Отбрось цифру
n = n // 10. Если забыть эту строку, цикл станет бесконечным.
n = 5682
s = 0
p = 1
c = 0
r = 0
while n > 0:
d = n % 10
s = s + d
p = p * d
c = c + 1
r = r * 10 + d
n = n // 10
print(s, p, c, r)▸ Ожидаемый результат
21 480 4 2865
n = int(input()); здесь значение записано в переменную, чтобы программа работала в браузере.x = 3704
k = 0
m = x
while x > 0:
if x % 10 % 2 == 0:
k = k + 1
x = x // 10
print(m * 10 + k)▸ Ожидаемый результат
37042
На экзамене программа выше начинается с x = int(input()), и с клавиатуры вводится 3704. Определите результат программы.
A) 37041 B) 3704 C) 37042 D) 24073 E) 37043
Показать решениеСкрыть решение
3704 → 4, чётная, k = 1
370 → 0, чётная, k = 2
37 → 7, нечётная, k = 2
3 → 3, нечётная, k = 2
x = 0 — цикл закончился. m хранит исходное число: m · 10 + k = 37040 + 2 = 37042.
Ответ: C. Ловушка: 0 — тоже чётная цифра; кто о ней забудет, выберет 37041.
Перевёрнутое число, палиндромы и «все цифры нечётные»
Чтобы построить перевёрнутое число, на каждом шаге умножаем прежний результат на 10 и прибавляем новую цифру: прежние цифры сдвигаются на один разряд влево. Число, равное своему перевёрнутому, — палиндром: 121, 4554, 7.
- rперевёрнутое число; в начале r = 0
- n % 10очередная последняя цифра
Перевёрнутое число: для 5682 r = 2, 28, 286, 2865. Проверка на палиндром: после цикла r == m (m — копия исходного числа).
- cколичество цифр числа n (счётчик цикла по цифрам)
- aдобавляемая цифра
Приписать цифру a к числу слева и справа.
1) Найдите перевёрнутое число для 1230; палиндром ли 1230? 2) Палиндром ли 4554? 3) Припишите цифру 7 к числу 309 слева и справа.
Показать решениеСкрыть решение
2) r: 4 → 45 → 455 → 4554 = n, значит, палиндром.
3) В числе 309 c = 3 цифры: 7 · 10³ + 309 = 7309; справа: 309 · 10 + 7 = 3097.
На вопрос «все ли цифры нечётные?» можно ответить двумя способами: посчитать нечётные цифры и сравнить с общим количеством цифр или взять флаг: сначала t = 1 («пока все нечётные»), а при первой же чётной цифре t = 0. В программе ниже внешний цикл перебирает числа, а внутренний — их цифры.
for n in [357, 48, 1991, 7, 5031]:
m = n
t = 1
while m > 0:
if m % 10 % 2 == 0:
t = 0
m = m // 10
if t == 1:
print(n)▸ Ожидаемый результат
357 1991 7
int(input()).Делители, простые числа и полные квадраты
Если n делится на i без остатка, то i — делитель n: n % i == 0. У каждого натурального числа больше 1 есть хотя бы два делителя: 1 и само число.
Натуральное число, у которого ровно два натуральных делителя (1 и само число): 2, 3, 5, 7, 11, 13, … Число, у которого делителей больше двух, — составное; 1 не является ни простым, ни составным.
Число, которое является квадратом натурального числа: 1, 4, 9, 16, 25, 36, …
- iпроверяемый кандидат в делители
- c == 2если делителей ровно 2, n — простое
Цикл по делителям: for i in range(1, n + 1): и внутри if n % i == 0:.
n = 60
c = 0
s = 0
t = 0
for i in range(1, n + 1):
if n % i == 0:
print(i, end=' ')
c = c + 1
s = s + i
if i % 2 == 1:
t = t + i
print()
print(c, s, t)▸ Ожидаемый результат
1 2 3 4 5 6 10 12 15 20 30 60 12 168 24
end=' ' печатает делители в одну строку.- pow(a, 0.5)квадратный корень из a, дробное число (
49 ** 0.5→7.0) - int(…)отбрасывает дробную часть
Если корень — целое число, a — полный квадрат. В решениях ГЭЦ встречается и запись a ** (1/2) — это то же самое.
1) Сколько делителей у числа 36? 2) Является ли 97 простым? 3) Найдите сумму делителей числа 28, кроме самого 28. 4) Сколько полных квадратов на отрезке [30; 50]?
Показать решениеСкрыть решение
2) Достаточно проверить числа от 2 до 9 (10 · 10 = 100 > 97). Ни одно из них не делит 97, значит, у 97 только два делителя — оно простое.
3) 1 + 2 + 4 + 7 + 14 = 28 — сумма равна самому числу (такие числа называют совершенными).
4) 36 и 49:
36 ** 0.5 → 6.0, 49 ** 0.5 → 7.0. Ответ: 2.Вложенные циклы: проверяем все числа отрезка
Если задание касается не одного числа, а каждого числа отрезка [a; b], цикл по делителям (или по цифрам) помещают внутрь другого цикла: внешний перебирает числа, внутренний — делители. Счётчик (c = 0) нужно обнулять для каждого нового числа, поэтому он пишется внутри внешнего цикла.
a = 20
b = 40
k = 0
for n in range(a, b + 1):
c = 0
for i in range(1, n + 1):
if n % i == 0:
c = c + 1
if c == 2:
print(n, end=' ')
k = k + 1
print()
print('count =', k)▸ Ожидаемый результат
23 29 31 37 count = 4
c = 0 перед внешним циклом и посмотри, что изменится.Сколько всего раз в программе выше выполняется проверка if n % i == 0?
Показать решениеСкрыть решение
Ответ: 630. С правилом √n проверок было бы гораздо меньше.
НОД, НОК и суммы
Наибольший общий делитель (НОД) двух чисел можно найти, не перебирая все делители, — алгоритмом Евклида. Он основан на факте: остаток от деления a на b тоже делится на НОД(a; b). Значит, пару (a; b) можно заменить парой (b; a % b), и числа быстро уменьшаются.
- a % bостаток от деления a на b
- b = 0останавливаемся, когда остаток равен 0: ответ — a
Алгоритм Евклида. В учебниках есть и вариант с вычитанием: вычитай меньшее число из большего, пока числа не станут равны.
- a · bпроизведение двух чисел
Наименьшее общее кратное сразу получается из НОД.
a = 84
b = 36
p = a * b
while b != 0:
r = a % b
a = b
b = r
print(a, p // a)▸ Ожидаемый результат
12 252
Найдите НОД(126; 84) и НОК(126; 84) алгоритмом Евклида. Сколько раз выполняется цикл?
Показать решениеСкрыть решение
(84; 42): 84 % 42 = 0 → (42; 0) — остановка.
НОД = 42, цикл выполнился 2 раза. НОК = 126 · 84 / 42 = 10584 / 42 = 252.
Суммы и произведения последовательностей считаются по той же схеме: накопитель (s = 0) или множитель (p = 1) и по одному члену на каждом шаге цикла. Для дробей используется /, результат — дробное число.
- s = s + 1 / is = s + 1 / iшаблон суммы в цикле
- p = p * iшаблон факториала (в начале p = 1)
i — переменная цикла: for i in range(1, n + 1):.
n = 4
s = 0
p = 1
for i in range(1, n + 1):
s = s + 1 / i
p = p * i
print(round(s, 4), p)▸ Ожидаемый результат
2.0833 24
round(s, 4) округляет результат до 4 знаков после запятой.Составьте цикл, вычисляющий S = 1 − 1/2 + 1/3 − 1/4, и найдите S.
Показать решениеСкрыть решение
s = s + z / i и z = -z.i = 1: s = 1
i = 2: s = 1 − 1/2 = 1/2
i = 3: s = 1/2 + 1/3 = 5/6
i = 4: s = 5/6 − 1/4 = 7/12 ≈ 0,5833.
Та же идея в блок-схеме разбирается в уроке «Построение блок-схем: письменные задания».
| Задача | Шаблон |
|---|---|
| сумма цифр | s = s + n % 10, n = n // 10 |
| количество цифр | c = c + 1; len(str(n)) |
| перевёрнутое число, палиндром | r = r * 10 + n % 10; r == m |
| количество делителей | if n % i == 0: c = c + 1 |
| простое число | c == 2 |
| полный квадрат | a ** 0.5 == int(a ** 0.5) |
| НОД | r = a % b, a = b, b = r |
| сумма 1 + 1/2 + … + 1/n | s = s + 1 / i |
- 1.Последняя цифра числа: d = n 10
- 2.Перевёрнутое число: r = r * + n % 10
- 3.У простого числа ровно делителя.
- 4.НОД(48; 18) =
- 5.Количество полных квадратов от 1 до 100:
С помощью цикла while найдите сумму цифр числа n = 90517 и перевёрнутое число и выведите их в одной строке через пробел.
n = 90517
s = 0
r = 0
# digit loop here
print(s, r)▸ Ожидаемый результат
22 71509
Выведите числа от 1 до 100 (включительно), у которых ровно 3 делителя, каждое в отдельной строке. Затем посмотрите на них: что у них общего?
for n in range(1, 101):
c = 0
# count the divisors of n here
if c == 3:
print(n)▸ Ожидаемый результат
4 9 25 49
Главное
n % 10даёт последнюю цифру,n // 10отбрасывает её; цикл по цифрам работает при условииwhile n > 0:.- Сумма начинается с 0, произведение — с 1; перевёрнутое число строится как
r = r * 10 + d, а палиндром равен своему перевёрнутому. - i — делитель n ⇔
n % i == 0; у простого числа ровно 2 делителя, для проверки простоты достаточно перебирать i, покаi * i <= n. - Полный квадрат:
a ** 0.5 == int(a ** 0.5); НОД — алгоритм Евклида, НОК = a · b / НОД. - Для каждого числа отрезка внешний цикл перебирает числа, внутренний — их делители или цифры; счётчик обнуляется внутри внешнего цикла.
Проверь себя
Вопросов: 12. Каждый правильный ответ приносит XP.