Что выведет программа: сумма нечётных цифр числа 58371 (цикл while)
Условие
Дана программа на языке Python. Сначала задаются значения n = 58371, s = 0, k = 0. Затем выполняется цикл while n > 0: с телом из трёх действий: d = n % 10, потом if d % 2 == 1: s = s + d; k = k + 1, потом n = n // 10. После завершения цикла выполняется команда print(s, k). Определите, какие два числа будут выведены на экран, и объясните, что именно вычисляет эта программа.
Ответ
16 4 (сумма нечётных цифр равна 16, таких цифр 4)
Решение по шагам
Шаг 1. Разбираемся, что делают операции % и //
Обе операции работают только с целыми числами.
- Остаток от деления на 10 — это последняя цифра числа:
58371 % 10даёт . - Целочисленное деление на 10 «отрезает» последнюю цифру:
58371 // 10даёт .
Значит, тело цикла на каждом витке достаёт очередную цифру справа и укорачивает число на один разряд. Цикл
while n > 0остановится тогда, когда от числа ничего не останется, то есть когдаnстанет равно .Условие
d % 2 == 1истинно ровно для нечётных цифр: . Итого переменнаяsкопит сумму нечётных цифр, аkсчитает, сколько их.- Остаток от деления на 10 — это последняя цифра числа:
Шаг 2. Заводим таблицу трассировки и проходим первые два витка
Трассировка — это таблица, в которой для каждого витка цикла выписаны все переменные. Заполним первые две строки.
Виток nдо виткаdНечётная? sпослеkпослеnпосле1 58371 1 да 1 1 5837 2 5837 7 да 8 2 583 Обратите внимание на порядок команд: сначала цифра извлекается и обрабатывается, и только потом число делится нацело. Если поменять эти строки местами, последняя цифра потеряется.
Осталось ещё 2 шага — откроются после входа:
- Шаг 3. Доводим трассировку до конца
- Шаг 4. Проверяем результат прямым счётом
Бесплатно · займёт минуту
Частые ошибки
- ✗
Путают
%и//: берутn % 10за «число без последней цифры», аn // 10— за саму цифру. - ✗
Проверяют чётность номера разряда, а не самой цифры: в переменной
dлежит именно цифра, поэтому восьмёрка не подходит независимо от того, на каком месте в записи числа она стоит. - ✗
Используют
n / 10вместоn // 10: получается вещественное число,nникогда не станет ровно нулём и цикл не завершится корректно. - ✗
Выводят только сумму 16, забывая про второе значение
k, хотяprint(s, k)печатает два числа.