Условие: № 4317 Пробный 06.2022 /dev/inf advanced (Уровень: Сложный)
Автомат обрабатывает натуральное число N по следующему алгоритму:
- Строится пятеричная запись числа N.
- К полученной записи дописываются разряды. Если последняя цифра в пятеричной записи четная, справа дописывается 2, если нечетная – слева дописывается 2 и справа 3.
- Результат переводится в десятичную систему и выводится на экран.
В результате работы автомата на экране появилось число, меньшее 1000. Для какого наибольшего значения N данная ситуация возможна?
for n in range(1, 1000):
M = []
x = n
while x > 0:
M.append(x % 5)
x //= 5
M.reverse()
if M[-1] % 2 == 0:
M.append(2)
else:
M = [3] + M + [2]
s = ''.join([str(x) for x in M])
r = int(s, 5)
if r < 1000:
print(n)
Комментарии к первому варианту решения задачи:
- for n in range(1, 1000): - Используем цикл for для перебора всех значений от 1 до 999, присваивая каждое значение переменной n.
- M = [] - Создаем пустой список M.
- x = n - Копируем значение переменной n в переменную x.
- while x > 0: - Запускаем цикл while, который будет выполняться, пока значение переменной x больше 0.
- M.append(x % 5) - Добавляем остаток от деления значения переменной x на 5 в конец списка M.
- x //= 5 - Делаем целочисленное деление значения переменной x на 5 и присваиваем результат переменной x.
- M.reverse() - Разворачиваем список M в обратном порядке.
- if M[-1] % 2 == 0: - Проверяем, является ли последний элемент списка M четным числом.
- M.append(2) - Если последний элемент списка M четный, добавляем число 2 в конец списка M.
- else: - Если условие из строки 8 ложно.
- M = [3] + M + [2] - Присваиваем переменной M список, который состоит из числа 3, содержимого списка M и числа 2.
- s = ''.join([str(x) for x in M]) - Создаем строку s, объединяя все элементы списка M в строку, преобразуя их в строки.
- r = int(s, 5) - Преобразуем строку s в целое число, используя систему счисления 5, и присваиваем результат переменной r.
- if r < 1000: - Проверяем, является ли значение переменной r меньше 1000.
- print(n) - Если условие из строки 14 истинно, выводим значение переменной n.
def system(x):
s = ''
while x > 0:
s += str(x % 5)
x //= 5
return s[::-1]
for n in range(1, 1000):
s = system(n)
if int(s[-1]) % 2 == 0:
s += '2'
else:
s = '2' + s + '3'
r = int(s, 5)
if r < 1000:
print(n)
Комментарии ко второму варианту решения задачи:
- def system(x): - Здесь мы определяем функцию system, которая переводит из десятичной записи числа в пятеричную.
- for n in range(1, 1000): - Запускаем цикл for, который проходит через числа от 1 до 999.
- s = system(n) - Вызываем функцию system для числа n и сохраняем результат в переменной s. Это дает нам представление числа n в пятеричной системе исчисления в виде строки.
- if int(s[-1]) % 2 == 0:- Проверяем, является ли последний символ строки s четной цифрой.
- s += '2' - Если последний символ строки s четный, добавляем символ '2' в конец строки.
- else: - Если последний символ строки s нечетный, то
- s = '2' + s + '3' - добавляем символ '2' в начало строки, затем добавляя содержимое исходной строки s и, наконец, символ '3' в конец строки.
- r = int(s, 5) - Преобразуем строку s в целое число, интерпретируя ее как число в пятеричной системе исчисления.
- if r < 1000: - Проверяем, является ли число r меньшим 1000.
- print(n) - Если число r меньше 1000, выводим значение n.