Программирование алгоритмов на языке программирования Python
Что проверяют по спецификации:
Суть за минуту
Это главная тема ЕНТ по информатике: почти в каждом варианте есть задания «что выведет программа», «сколько раз выполнится цикл», «какое значение примет переменная». Тема начинается с понятия алгоритма, его свойств и блок-схем, а затем переходит к языку Python 3: переменные и типы данных, ввод и вывод, арифметика с операциями //, % и **, условия if/elif/else, циклы while и for с range, break и continue. Отдельный блок — типовые алгоритмы: счётчик, сумматор, поиск максимума и минимума, разбор числа на цифры. Завершают тему списки (одномерные массивы) и двумерные списки (матрицы). Главный навык — аккуратная трассировка: выполнять программу «в уме» строка за строкой, записывая значения переменных в таблицу.Объясняем просто
Программа — это рецепт для очень послушного, но совсем не догадливого повара: он делает ровно то, что написано, строго по шагам, и ничего не додумывает.
Переменная — подписанная коробка
x = 5 — положили в коробку с надписью x число 5. x = x + 1 — достали 5, прибавили 1, положили обратно 6. Старое значение при этом пропадает.
Условие — развилка на дороге
if спрашивает «да или нет?». Если да — идём по одной ветке, если нет — по ветке else. Выполняется только одна ветка.
Цикл — «повтори N раз»
for i in range(5) — повтори 5 раз, i пробегает 0, 1, 2, 3, 4. while — «повторяй, пока условие верно», как «мешай, пока сахар не растворится».
Список — ряд пронумерованных шкафчиков
В a = [7, 2, 9] шкафчики пронумерованы с нуля: a[0] = 7, a[1] = 2, a[2] = 9. Номер с конца: a[-1] = 9.
Главные формулы
range(a, b, k) при и (иначе 0). Например, range(3, 20, 4): чисел (3, 7, 11, 15, 19). Для : при .Понятия и термины
- Алгоритм
- Конечная последовательность точных команд исполнителю, приводящая от исходных данных к результату.
- Блок-схема
- Набор специальных фигур, на котором процесс, система или алгоритм представлены в графическом виде (овал — начало/конец, параллелограмм — ввод/вывод, прямоугольник — действие, ромб — условие).
- Переменная
- Ячейка памяти, которая имеет два атрибута: имя и значение.
- Тип данных
- Множество допустимых значений и операций над ними: int — целые, float — вещественные, str — строки, bool — логические (True/False).
- Условный оператор
- Важнейшая структура программы, обеспечивающая выполнение одного действия из нескольких последовательностей действий в зависимости от условий (в Python: if, elif, else).
- Цикл
- Фрагмент программы для многократного выполнения какого-либо кода при условии, что условие является истинным.
- while (пока)
- Оператор цикла с предусловием: условие проверяется перед каждым повторением, и тело выполняется, пока оно истинно.
- Массив (список)
- Совокупность переменных, содержащих данные одного типа, объединённых общим именем; доступ к элементу — по индексу. В Python массив реализуется списком list.
- Индекс
- Номер элемента в списке или строке; в Python нумерация начинается с 0, отрицательные индексы считаются с конца.
- Трассировка
- Пошаговое выполнение алгоритма вручную с записью значений всех переменных в таблицу после каждой команды.
Разбор темы
Алгоритм, его свойства и блок-схемы 5–8 класс
Алгоритм — это конечная последовательность точных команд, выполнение которых приводит к результату. Исполнитель (человек, робот, компьютер) выполняет команды формально, не задумываясь об их смысле.
Свойства алгоритма (их любят спрашивать на соответствие): дискретность — алгоритм разбит на отдельные шаги; понятность — команды входят в систему команд исполнителя; определённость (детерминированность) — каждая команда однозначна, при одних и тех же данных результат всегда один и тот же; результативность — алгоритм приводит к результату; конечность — результат получается за конечное число шагов; массовость — алгоритм подходит для целого класса задач с разными исходными данными.
Способы записи алгоритма: словесный (на естественном языке), графический (блок-схема), на псевдокоде, на языке программирования (программа).
Фигуры блок-схемы: овал (скруглённый прямоугольник) — «Начало» и «Конец»; параллелограмм — ввод и вывод данных; прямоугольник — действие (вычисление, присваивание); ромб — проверка условия, из него выходят две стрелки «да» и «нет»; шестиугольник — заголовок цикла с параметром (цикл for); прямоугольник с двойными боковыми линиями — вызов подпрограммы.
Базовые алгоритмические структуры: линейная (следование) — команды выполняются одна за другой; ветвление — выбор одного из путей по условию (в блок-схеме ромб, пути потом сходятся); цикл — повторение действий (в блок-схеме стрелка возвращается назад к условию). Любой алгоритм строится из этих трёх структур.
Переменные, типы данных, ввод и вывод 6 класс
Переменная создаётся присваиванием: x = 5. Знак = означает «положить значение справа в переменную слева», а не равенство. Запись x = x + 1 увеличивает x на 1 (кратко: x += 1). Имена: латинские буквы, цифры и _, не начинаются с цифры, регистр важен (A и a — разные переменные), нельзя использовать служебные слова (if, for, while...).
Основные типы: int — целые числа (5, -12, 0), float — вещественные (3.14, 2.0, 1e3), str — строки в кавычках ('hi', "5"), bool — логические True и False. Узнать тип: type(x). Python сам определяет тип по значению (динамическая типизация).
Множественное присваивание: a, b = 3, 7. Обмен значений без третьей переменной: a, b = b, a. Классический способ с третьей переменной: t = a; a = b; b = t.
Ввод: input() всегда возвращает строку. Поэтому для чисел: n = int(input()), x = float(input()). Несколько чисел в одной строке: a, b = map(int, input().split()).
Вывод: print(a, b, c) печатает значения через пробел и переходит на новую строку. Параметр sep задаёт разделитель между значениями, end — что печатается в конце (по умолчанию перенос строки '\n').
print(1, 2, 3, sep='-') # 1-2-3
print('a', end='')
print('b') # ab
print(5, 6, sep='', end='!') # 56!print() без аргументов выводит пустую строку. f-строки: print(f'x = {x}') подставляет значение переменной в текст.
Арифметические операции, приоритет и преобразование типов 6–7 класс
Операции: +, -, *; / — обычное деление, результат всегда float (6 / 2 = 3.0); // — целочисленное деление (округление вниз, к меньшему числу); % — остаток от деления; ** — возведение в степень.
Примеры: 17 // 5 = 3, 17 % 5 = 2, 2 ** 10 = 1024. С отрицательными числами // округляет вниз: -17 // 5 = -4 (а не -3!), -17 % 5 = 3 (остаток имеет знак делителя). 7.5 // 2 = 3.0 — если один операнд float, результат тоже float.
Приоритет (от высшего к низшему): скобки () → ** → унарный минус -x → *, /, //, % → +, - → сравнения <, >, ==, !=, <=, >= → not → and → or. Операции одного приоритета выполняются слева направо, кроме **, которая выполняется справа налево: 2 ** 3 ** 2 = 2 ** 9 = 512. Также -2 ** 2 = -4, потому что степень старше минуса.
Пример расчёта: 2 + 3 * 4 ** 2 // 5 → сначала 4 ** 2 = 16, затем слева направо 3 * 16 = 48, 48 // 5 = 9, и наконец 2 + 9 = 11.
Преобразование типов: int('12') = 12; int(3.99) = 3 и int(-3.99) = -3 — дробная часть просто отбрасывается (к нулю); float('2.5') = 2.5; str(7) = '7'; round(3.5) = 4, но round(2.5) = 2 (Python округляет «половинки» к чётному). bool(0), bool(''), bool([]) — False, любое ненулевое число и непустая строка (даже '0') — True.
Строки тоже «складываются» и «умножаются»: '2' + '3' = '23' (склейка), 'ab' * 3 = 'ababab'. Но '2' + 3 — ошибка TypeError: строку и число складывать нельзя.
Полезные встроенные функции: abs(x) — модуль, max(a, b, c) и min(...), round(x, 2) — округление до 2 знаков, len(s) — длина. Модуль math: import math, math.sqrt(16) = 4.0, math.ceil(2.1) = 3, math.floor(2.9) = 2.
Ветвление: if, elif, else; логические операции 7 класс
Структура: после if условие: ставится двоеточие, тело пишется с отступом в 4 пробела. Ветка elif (иначе если) проверяется, только если все предыдущие условия ложны; else выполняется, если ложны все. Из всей цепочки выполняется ровно одна ветка (или ни одной, если нет else).
if score >= 90:
grade = 5
elif score >= 75:
grade = 4
elif score >= 50:
grade = 3
else:
grade = 2Порядок elif важен: при score = 95 сработает первая ветка, хотя 95 >= 75 тоже верно. Если бы проверки шли от меньшего к большему (сначала >= 50), все хорошие оценки ошибочно стали бы тройками.
Операции сравнения: == (равно; одиночное = — это присваивание!), != (не равно), <, >, <=, >=. Python разрешает цепочки: 0 < x < 10 означает 0 < x and x < 10.
Логические операции: and (И) — истина, только если истинны оба условия; or (ИЛИ) — истина, если истинно хотя бы одно; not (НЕ) — меняет значение на противоположное. Приоритет: not, затем and, затем or. Пример: x % 2 == 0 and x > 10 — x чётное и больше 10. Проверка на делимость: n % k == 0.
Вложенные условия — if внутри if; принадлежность к ветке определяется отступом. Составные условия часто заменяют вложенность: if a > b and a > c: вместо двух вложенных if.
Тернарная запись: m = a if a > b else b — короткое ветвление в одну строку.
Цикл while и обработка цифр числа 8 класс
while условие: — цикл с предусловием: условие проверяется перед каждой итерацией; если оно сразу ложно, тело не выполнится ни разу. Внутри тела что-то обязательно должно менять условие, иначе цикл станет бесконечным.
n = 4728
s = 0
while n > 0:
s += n % 10 # прибавили последнюю цифру
n //= 10 # отбросили её
print(s) # 21Стандартные задачи на цифры: количество цифр (k += 1 в каждой итерации), сумма цифр (s += n % 10), произведение цифр (p *= n % 10, начальное p = 1), максимальная цифра, число наоборот (r = r * 10 + n % 10), количество чётных цифр (if n % 10 % 2 == 0: k += 1).
Важно: цикл «портит» n (в конце n = 0), поэтому если исходное число нужно потом, сохраните копию: m = n. Для n = 0 цикл while n > 0 не выполнится ни разу — количество цифр получится 0, а не 1.
while удобен, когда число повторений заранее неизвестно: «пока сумма меньше 100», «пока не введут 0», алгоритм Евклида: while a != b: if a > b: a -= b else: b -= a (или быстрее while b: a, b = b, a % b), получаем НОД.
Перевод числа в двоичную систему тоже делается через while: while n > 0: s = str(n % 2) + s; n //= 2.
Цикл for, функция range, break, continue, else 8 класс
for i in range(...) — цикл с параметром: переменная i по очереди принимает значения из диапазона. Формы range: range(n) — 0, 1, ..., n-1 (n чисел); range(a, b) — от a до b-1; range(a, b, k) — от a с шагом k, не доходя до b.
Правая граница никогда не входит: range(1, 5) → 1, 2, 3, 4. Отрицательный шаг — счёт назад: range(10, 0, -3) → 10, 7, 4, 1. Пустые диапазоны: range(5, 1) (шаг +1, а нужно идти вниз) и range(1, 5, -1) — цикл не выполнится ни разу.
for перебирает не только числа, но и элементы строки или списка: for ch in 'abc': — ch = 'a', 'b', 'c'; for x in [3, 8, 1]: — x = 3, 8, 1. После окончания цикла переменная i хранит последнее значение (для range(5) это 4).
break — немедленно прерывает весь цикл. continue — пропускает остаток текущей итерации и переходит к следующей. Обе действуют только на самый внутренний цикл, в котором находятся.
else у цикла выполняется, если цикл закончился «естественно», без break. Классика — проверка на простоту:
n = 29
for d in range(2, n):
if n % d == 0:
print('составное')
break
else:
print('простое')Бесконечный цикл с выходом по break: while True: ... if условие: break — удобен, когда проверка нужна в середине тела.
Типовые алгоритмы, вложенные циклы и трассировка 8–9 класс
Счётчик: перед циклом k = 0, внутри if условие: k += 1. Сумматор (накопитель): s = 0, внутри s += x. Произведение: начальное значение p = 1 (не 0, иначе всё время будет 0!). Факториал: f = 1; for i in range(1, n + 1): f *= i.
Поиск максимума: за начальное значение берём первый элемент mx = a[0] (не 0 — вдруг все числа отрицательные), затем if x > mx: mx = x. Для минимума — знак <. Индекс максимума: храним imax, сравниваем a[i] > a[imax]. Строгое > даёт первый максимум, нестрогое >= — последний.
Вложенные циклы: внутренний цикл полностью проходит при каждой итерации внешнего. for i in range(3): for j in range(4): — тело выполнится 3 · 4 = 12 раз. Если внутренний зависит от внешнего (for j in range(i, 4)), считайте по строкам: при i = 0, 1, 2, 3 будет 4 + 3 + 2 + 1 = 10 повторений.
for i in range(1, 4):
for j in range(1, 4):
print(i * j, end=' ')
print() # перенос строки после каждой строки таблицыТрассировка — главный инструмент для заданий «что выведет программа». Рисуем таблицу: столбцы — переменные и проверяемое условие, строки — шаги. После каждой команды записываем новые значения. Правило: меняем только ту переменную, которой присваивают; условие цикла проверяем до входа в тело.
Пример трассировки s = 0; for i in range(1, 6, 2): s += i * i: i = 1 → s = 1; i = 3 → s = 10; i = 5 → s = 35. Ответ 35.
Ошибки бывают синтаксические (забыто двоеточие, неверный отступ — программа не запустится), ошибки выполнения (деление на ноль ZeroDivisionError, выход за границы списка IndexError, неверный тип TypeError) и логические (программа работает, но ответ неверный — их ищут трассировкой и тестированием).
Списки (одномерные массивы) и двумерные списки (матрицы) 9 класс
Список — упорядоченный набор элементов: a = [5, 3, 8, 1]. Индексы с нуля: a[0] = 5, a[3] = 1, a[-1] = 1 (последний), a[-2] = 8. len(a) = 4, допустимые индексы 0..3; обращение к a[4] — ошибка IndexError. Элемент можно изменить: a[1] = 10.
Срезы a[start:stop:step] — как range: stop не входит. a[1:3] → элементы с индексами 1 и 2; a[:2] — первые два; a[2:] — с индекса 2 до конца; a[::2] — через один; a[::-1] — список наоборот. Срез создаёт новый список и никогда не вызывает IndexError.
Методы: a.append(x) — добавить в конец; a.insert(i, x) — вставить x на позицию i (остальные сдвигаются вправо); a.pop() — удалить и вернуть последний, a.pop(i) — элемент с индексом i; a.remove(x) — удалить первое вхождение значения x; a.index(x) — индекс первого x; a.count(x) — сколько раз встречается x; a.sort() — сортировка по возрастанию (reverse=True — по убыванию), a.reverse() — разворот. Функции: len(a), sum(a), max(a), min(a), sorted(a) (новый отсортированный список), проверка x in a.
Создание: [0] * 5 → [0, 0, 0, 0, 0]; list(range(1, 6)) → [1, 2, 3, 4, 5]; ввод: a = list(map(int, input().split())). Генератор списка (list comprehension): [i * i for i in range(1, 6)] → [1, 4, 9, 16, 25]; с условием: [x for x in a if x > 0] — только положительные.
Перебор по индексам for i in range(len(a)): нужен, когда важна позиция или нужно менять элементы; перебор по значениям for x in a: — когда нужны только значения. Обмен двух элементов: a[i], a[j] = a[j], a[i].
Двумерный список — список списков: m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]. m[i][j] — элемент в строке i и столбце j: m[1][2] = 6. Число строк len(m), столбцов len(m[0]). Обход — двумя вложенными циклами по i и j.
for i in range(len(m)):
for j in range(len(m[0])):
print(m[i][j], end=' ')
print()В квадратной матрице n×n: главная диагональ — элементы m[i][i] (i == j), побочная — m[i][n-1-i] (i + j == n - 1); выше главной диагонали i < j, ниже — i > j. Сумма строки i: sum(m[i]); сумма столбца j: sum(m[i][j] for i in range(n)). Правильное создание матрицы нулей: [[0] * m for i in range(n)]; запись [[0] * m] * n создаёт n ссылок на одну и ту же строку, и изменение одного элемента меняет весь столбец.
Примеры задач с решением
print(2 + 3 * 4 ** 2 // 5 - 7 % 3)
print(-17 // 5, -17 % 5)- Первая строка, по приоритету: сначала степень
4 ** 2= 16. - Затем
*,//,%слева направо:3 * 16= 48,48 // 5= 9 (9 · 5 = 45, остаток 3 отбрасываем),7 % 3= 1. - Наконец сложение и вычитание: 2 + 9 − 1 = 10.
- Вторая строка: −17 / 5 = −3,4;
//округляет вниз, к меньшему числу, то есть к −4. - Остаток: −17 − 5 · (−4) = −17 + 20 = 3. Проверка: 5 · (−4) + 3 = −17.
n = 4728
s = 0
r = 0
while n > 0:
d = n % 10
s = s + d
r = r * 10 + d
n = n // 10
print(s, r)- Начало: n = 4728, s = 0, r = 0. Условие n > 0 истинно.
- Итерация 1: d = 8, s = 8, r = 0 · 10 + 8 = 8, n = 472.
- Итерация 2: d = 2, s = 10, r = 8 · 10 + 2 = 82, n = 47.
- Итерация 3: d = 7, s = 17, r = 827, n = 4.
- Итерация 4: d = 4, s = 21, r = 8274, n = 0.
- Проверка условия: 0 > 0 ложно — выход из цикла. Цикл выполнился 4 раза (по числу цифр). s — сумма цифр, r — число наоборот.
s = 0
for i in range(10, 0, -3):
s = s + i
print(s, i)- Шаг отрицательный, значит идём вниз от 10, не доходя до 0: 10, 7, 4, 1 (следующее было бы −2, а оно уже за границей 0).
- Количество итераций по формуле: ⌈(10 − 0) / 3⌉ = ⌈3,33⌉ = 4.
- Трассировка: i = 10 → s = 10; i = 7 → s = 17; i = 4 → s = 21; i = 1 → s = 22.
- После цикла i хранит последнее значение — 1.
a = 8
b = 3
if a % b == 0 or a > 10:
print(1)
elif not (a < b) and b % 2 == 1:
print(2)
else:
print(3)- Первое условие:
8 % 3= 2, значитa % b == 0— False;a > 10— False. False or False = False, ветка if пропускается. - Условие elif:
a < b→ 8 < 3 → False,not False= True;b % 2 == 1→ 3 % 2 = 1 → True. - True and True = True — выполняется ветка elif, печатается 2. Ветка else уже не проверяется.
a = [4, 7, 1, 9]
a.append(a[1] + a[2])
a.insert(0, a.pop())
a.remove(7)
print(a[1:3], a[-1], len(a))a[1] + a[2]= 7 + 1 = 8, append добавляет в конец: [4, 7, 1, 9, 8].a.pop()удаляет и возвращает последний элемент 8: список [4, 7, 1, 9]; затемinsert(0, 8)ставит 8 в начало: [8, 4, 7, 1, 9].remove(7)удаляет значение 7 (не индекс!): [8, 4, 1, 9].a[1:3]— индексы 1 и 2: [4, 1];a[-1]= 9; длина 4.
k = 0
for i in range(1, 4):
for j in range(i, 4):
k = k + i * j
print(k)- Внутренний цикл зависит от i, поэтому трассируем по строкам внешнего цикла.
- i = 1: j = 1, 2, 3 → прибавляем 1 + 2 + 3 = 6, k = 6.
- i = 2: j = 2, 3 → прибавляем 4 + 6 = 10, k = 16.
- i = 3: j = 3 → прибавляем 9, k = 25.
- Всего тело выполнилось 3 + 2 + 1 = 6 раз.
Сложные задачи: шаг за шагом
x = 0
y = 1
while y < 50:
x = x + 1
y = y * 2 + x
print(x, y)Идея: Число итераций заранее неизвестно — строим таблицу трассировки и проверяем условие перед каждой итерацией. Важно: y вычисляется уже с новым x.
- Таблица трассировкиСтарт: x = 0, y = 1; 1 < 50 — входим.Итерация 1: x = 1, y = 1 · 2 + 1 = 3.Итерация 2: x = 2, y = 3 · 2 + 2 = 8.Итерация 3: x = 3, y = 8 · 2 + 3 = 19.Итерация 4: x = 4, y = 19 · 2 + 4 = 42; 42 < 50 — ещё раз.Итерация 5: x = 5, y = 42 · 2 + 5 = 89.
- ВыходПроверка 89 < 50 ложна, цикл заканчивается. Значения после цикла печатаются один раз.
s = 0
for i in range(1, 20, 2):
if i % 3 == 0:
continue
if s > 20:
break
s = s + i
print(i, s)Идея: continue пропускает только текущее значение i, break завершает весь цикл; проверка s > 20 стоит до прибавления.
- Значения irange(1, 20, 2) даёт нечётные 1, 3, 5, ..., 19.
- Трассировкаi = 1: не кратно 3, s = 0 ≤ 20 → s = 1.i = 3: кратно 3 → continue.i = 5: s = 6. i = 7: s = 13.i = 9: кратно 3 → continue.i = 11: s = 13 ≤ 20 → s = 24.i = 13: не кратно 3, но s = 24 > 20 → break. Прибавление не произошло.
- ВыводПосле break переменная i осталась равной 13, s = 24.
m = [[i * 3 + j for j in range(3)] for i in range(3)]
s = 0
for i in range(3):
for j in range(3):
if i > j:
s = s + m[i][j]
print(s, m[2][::-1])Идея: Сначала строим матрицу по генератору, затем отбираем элементы ниже главной диагонали (i > j).
- Строим матрицуЭлемент m[i][j] = 3i + j. Строка 0: [0, 1, 2], строка 1: [3, 4, 5], строка 2: [6, 7, 8].
- Элементы ниже главной диагоналиУсловие i > j выполняется для (1,0), (2,0), (2,1): это m[1][0] = 3, m[2][0] = 6, m[2][1] = 7.s = 3 + 6 + 7 = 16.
- Срез строкиm[2] = [6, 7, 8], срез [::-1] разворачивает её: [8, 7, 6].
Частые ловушки на ЕНТ
/всегда даёт float:6 / 2= 3.0, а не 3. Целое частное — только//.- С отрицательными числами
//округляет вниз:-7 // 2= -4,-7 % 2= 1. Аint(-3.5)= -3 — отбрасывание к нулю. Не путайте. - Правая граница range и среза не входит:
range(1, 5)— 1..4,a[1:3]— два элемента.range(5, 1)без отрицательного шага пуст. input()возвращает строку: безint()получится'2' + '3'= '23'. Также2 ** 3 ** 2= 512 (степень справа налево),-2 ** 2= -4.a.remove(x)удаляет по значению,a.pop(i)— по индексу. Индексы начинаются с 0, последний элемент —a[len(a) - 1]илиa[-1];a[len(a)]— ошибка.
Запомнить
// — вниз, % — знак делителя, range и срезы без правой границы, индексы с нуля, input — строка; сомневаешься — делай трассировочную таблицу.
Проверь себя
print(17 // 5, 17 % 5, 2 ** 4)3 2 163.4 2 163 2 82 3 16
Показать ответ
3 2 16 17 // 5 = 3 (целая часть), 17 % 5 = 2 (остаток), 2 ** 4 = 16.
print(-7 // 2, -7 % 2)-3 -1-4 1-3 1-4 -1
Показать ответ
-4 1 −3,5 округляется вниз до −4; остаток −7 − 2 · (−4) = 1.
s = 0
for i in range(2, 11, 3):
s += i
print(s)26181510
Показать ответ
15 i = 2, 5, 8 (11 не входит): 2 + 5 + 8 = 15.
a = [3, 8, 1, 6, 4]
print(a[1:4], a[-2])[3, 8, 1] 4[8, 1, 6, 4] 6[8, 1] 6[8, 1, 6] 6
Показать ответ
[8, 1, 6] 6 Срез [1:4] — индексы 1, 2, 3: [8, 1, 6]; a[-2] — предпоследний элемент 6.
print(1, 2, 3, sep='-', end='!')
print(4)1 2 3!41-2-3!41-2-3-!41-2-3!и4на новой строке
Показать ответ
1-2-3!4 sep='-' ставит дефис между значениями, end='!' заменяет перенос строки, поэтому 4 печатается в той же строке.
n = 2024
s = 0
while n > 0:
s += n % 10
n //= 10
print(s)8420220244
Показать ответ
8 Цикл складывает цифры: 4 + 2 + 0 + 2 = 8.