Перейти к содержанию
Educora
Средний8–9 классы25 мин32 / 59

Операции над числами: цифры, делители и простые числа

Разбиваем число на цифры с помощью `n % 10` и `n // 10`; находим сумму, произведение, количество цифр и перевёрнутое число; считаем делители, проверяем простоту и полный квадрат; вычисляем НОД алгоритмом Евклида. Готовые шаблоны для заданий ГЭЦ.

Проверь себя
В этом уроке ты узнаешь
  • разбирать число на цифры с помощью 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 = n % 10 n = n // 10
где:
  • dпоследняя цифра (0…9)
  • %остаток от деления
  • //целочисленное деление: дробная часть отбрасывается, число становится на одну цифру короче

Две главные команды цикла по цифрам. Цикл работает с условием while n > 0:.

n // pow(10, k) % 10 n % pow(10, k) n // pow(10, k)
где:
  • 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. Берём цифры

Вычислите: 1) 7049 % 10 и 7049 // 10; 2) цифру десятков и цифру сотен числа 7049; 3) 30 % 10 и 30 // 10.

Показать решение
1) 7049 = 704 · 10 + 9, значит, 7049 % 10 = 9, а 7049 // 10 = 704.
2) Десятки: 7049 // 10 % 10 = 704 % 10 = 4. Сотни: 7049 // 100 % 10 = 70 % 10 = 0.
3) 30 % 10 = 0, 30 // 10 = 3. Последняя цифра может быть 0 — цикл по цифрам учитывает и её.
  1. 1
    Сохрани копию

    В цикле n изменится и станет 0. Если исходное число понадобится потом, сначала запиши m = n.

  2. 2
    Начальные значения

    сумма s = 0, произведение p = 1, количество c = 0, перевёрнутое число r = 0.

  3. 3
    Условие цикла

    while n > 0: — пока остаются цифры.

  4. 4
    Возьми цифру и обработай её

    d = n % 10, затем s = s + d, p = p * d, c = c + 1, r = r * 10 + d или условие, например if d % 2 == 0:.

  5. 5
    Отбрось цифру

    n = n // 10. Если забыть эту строку, цикл станет бесконечным.

Python
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()); здесь значение записано в переменную, чтобы программа работала в браузере.
Python
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
Программа к примеру 2. Сначала найди результат сам, потом запусти программу и проверь.
Пример 2. Задание в стиле ГЭЦ: результат программы

На экзамене программа выше начинается с x = int(input()), и с клавиатуры вводится 3704. Определите результат программы.
A) 37041 B) 3704 C) 37042 D) 24073 E) 37043

Показать решение
Трассировочная таблица (x → последняя цифра, чётная?, k):
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 * 10 + n % 10
где:
  • rперевёрнутое число; в начале r = 0
  • n % 10очередная последняя цифра

Перевёрнутое число: для 5682 r = 2, 28, 286, 2865. Проверка на палиндром: после цикла r == m (m — копия исходного числа).

a * pow(10, c) + n n * 10 + a
где:
  • cколичество цифр числа n (счётчик цикла по цифрам)
  • aдобавляемая цифра

Приписать цифру a к числу слева и справа.

Пример 3. Переворот числа и приписывание цифр

1) Найдите перевёрнутое число для 1230; палиндром ли 1230? 2) Палиндром ли 4554? 3) Припишите цифру 7 к числу 309 слева и справа.

Показать решение
1) r: 0 → 3 → 32 → 321. Перевёрнутое число — 321 (0321 не пишут); 321 ≠ 1230 — не палиндром.
2) r: 4 → 45 → 455 → 4554 = n, значит, палиндром.
3) В числе 309 c = 3 цифры: 7 · 10³ + 309 = 7309; справа: 309 · 10 + 7 = 3097.

На вопрос «все ли цифры нечётные?» можно ответить двумя способами: посчитать нечётные цифры и сравнить с общим количеством цифр или взять флаг: сначала t = 1 («пока все нечётные»), а при первой же чётной цифре t = 0. В программе ниже внешний цикл перебирает числа, а внутренний — их цифры.

Python
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
5031 не печатается: 0 — чётная цифра. В письменном задании числа читаются по одному через 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, …

n % i == 0, i = 1, 2, …, n
где:
  • iпроверяемый кандидат в делители
  • c == 2если делителей ровно 2, n — простое

Цикл по делителям: for i in range(1, n + 1): и внутри if n % i == 0:.

Python
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
Делители числа 60, их количество (12), сумма (168) и сумма нечётных делителей (1 + 3 + 5 + 15 = 24). end=' ' печатает делители в одну строку.
pow(a, 0.5) == int(pow(a, 0.5))
где:
  • pow(a, 0.5)квадратный корень из a, дробное число (49 ** 0.5 → 7.0)
  • int(…)отбрасывает дробную часть

Если корень — целое число, a — полный квадрат. В решениях ГЭЦ встречается и запись a ** (1/2) — это то же самое.

Пример 4. Делители, простота, квадраты

1) Сколько делителей у числа 36? 2) Является ли 97 простым? 3) Найдите сумму делителей числа 28, кроме самого 28. 4) Сколько полных квадратов на отрезке [30; 50]?

Показать решение
1) 1, 2, 3, 4, 6, 9, 12, 18, 36 — 9 делителей. Количество нечётное, потому что делители идут парами (1 · 36, 2 · 18, 3 · 12, 4 · 9), а 6 образует пару сам с собой: 6 · 6 = 36.
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) нужно обнулять для каждого нового числа, поэтому он пишется внутри внешнего цикла.

Python
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
Простые числа отрезка [20; 40]. Перенеси строку c = 0 перед внешним циклом и посмотри, что изменится.
Пример 5. Сколько раз выполняется внутренний цикл?

Сколько всего раз в программе выше выполняется проверка if n % i == 0?

Показать решение
Для каждого n внутренний цикл принимает значения i = 1, 2, …, n, то есть выполняется n раз. Всего: 20 + 21 + … + 40 — арифметическая прогрессия из 21 члена: (20 + 40) · 21 / 2 = 630.
Ответ: 630. С правилом √n проверок было бы гораздо меньше.

НОД, НОК и суммы

Наибольший общий делитель (НОД) двух чисел можно найти, не перебирая все делители, — алгоритмом Евклида. Он основан на факте: остаток от деления a на b тоже делится на НОД(a; b). Значит, пару (a; b) можно заменить парой (b; a % b), и числа быстро уменьшаются.

НОД(a; b) = НОД(b; a % b), НОД(a; 0) = a
где:
  • a % bостаток от деления a на b
  • b = 0останавливаемся, когда остаток равен 0: ответ — a

Алгоритм Евклида. В учебниках есть и вариант с вычитанием: вычитай меньшее число из большего, пока числа не станут равны.

НОК(a; b) = a · b / НОД(a; b)НОК(a; b) = a · b / НОД(a; b)
где:
  • a · bпроизведение двух чисел

Наименьшее общее кратное сразу получается из НОД.

Python
a = 84
b = 36
p = a * b
while b != 0:
    r = a % b
    a = b
    b = r
print(a, p // a)
▸ Ожидаемый результат
12 252
(84; 36) → (36; 12) → (12; 0): НОД = 12, НОК = 3024 / 12 = 252. Вариант с вычитанием: (84; 36) → (48; 36) → (12; 36) → (12; 24) → (12; 12).
Пример 6. НОД и НОК

Найдите НОД(126; 84) и НОК(126; 84) алгоритмом Евклида. Сколько раз выполняется цикл?

Показать решение
(126; 84): 126 % 84 = 42 → (84; 42)
(84; 42): 84 % 42 = 0 → (42; 0) — остановка.
НОД = 42, цикл выполнился 2 раза. НОК = 126 · 84 / 42 = 10584 / 42 = 252.

Суммы и произведения последовательностей считаются по той же схеме: накопитель (s = 0) или множитель (p = 1) и по одному члену на каждом шаге цикла. Для дробей используется /, результат — дробное число.

S = 1 + 1/2 + 1/3 + … + 1/n n! = 1 · 2 · 3 · … · nS = 1 + 1/2 + 1/3 + … + 1/n n! = 1 · 2 · 3 · … · n
где:
  • s = s + 1 / is = s + 1 / iшаблон суммы в цикле
  • p = p * iшаблон факториала (в начале p = 1)

i — переменная цикла: for i in range(1, n + 1):.

Python
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
1 + 1/2 + 1/3 + 1/4 = 25/12 ≈ 2,0833 и 4! = 24. round(s, 4) округляет результат до 4 знаков после запятой.
Пример 7. Знакочередующаяся сумма

Составьте цикл, вычисляющий S = 1 − 1/2 + 1/3 − 1/4, и найдите S.

Показать решение
Для знака берём переменную z: сначала z = 1, на каждом шаге 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/ns = s + 1 / i
Готовые шаблоны. Как собрать из них полную программу, показано в уроке «Написание программ: письменные задания».
Проверь себя: заполни пропуск
  1. 1.Последняя цифра числа: d = n 10
  2. 2.Перевёрнутое число: r = r * + n % 10
  3. 3.У простого числа ровно делителя.
  4. 4.НОД(48; 18) =
  5. 5.Количество полных квадратов от 1 до 100:
Задание

С помощью цикла while найдите сумму цифр числа n = 90517 и перевёрнутое число и выведите их в одной строке через пробел.

Задание · Python
n = 90517
s = 0
r = 0
# digit loop here

print(s, r)
▸ Ожидаемый результат
22 71509
Задание

Выведите числа от 1 до 100 (включительно), у которых ровно 3 делителя, каждое в отдельной строке. Затем посмотрите на них: что у них общего?

Задание · Python
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.

1 / 12
Какое выражение даёт последнюю цифру числа n?