Решение: Анализ алгоритма в системах счисления
Ниже на пяти языках программирования записан алгоритм. Получив на вход натуральное десятичное число $x$, этот алгоритм печатает два числа: $L$ и $M$. Укажите наибольшее число $x$, при вводе которого алгоритм выводит сначала 10, а потом 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 шаговНа каждой итерации число заменяется на результат целочисленного деления на 8. Поэтому число итераций $M$ равно количеству цифр числа $x$ в восьмеричной системе счисления.
Так как $M = 3$, запишем число в виде $x = \overline{abc}_8$, где $a \ne 0$, а $a$, $b$, $c$ — цифры от 0 до 7.
В каждой итерации проверяется чётность текущего числа. Это соответствует чётности последней цифры его восьмеричной записи. Если цифра чётная, она прибавляется к $L$.
Следовательно, сумма чётных цифр $a$, $b$, $c$ должна быть равна 10. Для максимального числа сначала выбираем максимально возможную первую цифру: $a = 7$. Цифра 7 нечётная, поэтому для максимального второй цифры берём $b = 6$, а тогда $c = 4$.
Получаем $x = \overline{764}_8 = 7 \cdot 8^2 + 6 \cdot 8 + 4 = 500$.
Где здесь ошибаются
Считать, что число итераций равно количеству цифр в десятичной записи.
Прибавлять к L все цифры, не учитывая проверку на чётность.
Забыть перевести найденное восьмеричное число в десятичную систему.