Решение: Анализ алгоритма в пяти языках
Ниже на пяти языках программирования записан алгоритм. Получив на вход натуральное десятичное число $x$, этот алгоритм печатает два числа: $L$ и $M$. Укажите наибольшее число $x$, при вводе которого алгоритм выводит сначала $2$, а потом $3$.
1x = int(input()) 2L = 0 3M = 0 4while x > 0: 5 M = M + 1 6 if x % 2 == 0: 7 L = L + x % 8 8 x = x // 8 9print(L) 10print(M)
Решение по шагам
5 шаговЗа одну итерацию значение $x$ заменяется на результат целочисленного деления на $8$. Поэтому $M$ равно числу цифр исходного числа в восьмеричной системе счисления.
Условие $M=3$ означает, что $64 \leqslant x \leqslant 511$.
Величина $L$ увеличивается только тогда, когда текущее значение $x$ чётно, и увеличивается на остаток от деления этого значения на $8$.
Для получения $L=2$ при максимальном возможном числе берём $x=506$. Последовательность значений перед делением: $506$, $63$, $7$. Чётным является только $506$, поэтому $L=506\bmod 8=2$, а $M=3$.
Число $506$ является наибольшим подходящим значением: при нём алгоритм выполняет ровно три итерации и печатает сначала $2$, затем $3$.
Где здесь ошибаются
Путать остаток от деления на $8$ с частным.
Считать количество итераций по десятичным цифрам, а не по последовательным делениям на $8$.
Добавлять остаток в $L$ на каждой итерации, не проверяя чётность текущего значения.