(В.
Лашин) На вход алгоритма подаётся натуральное число N.
Алгоритм строит по нему новое число R следующим образом.
1. Строится троичная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
a) если число N делится на 5, то к этой записи дописываются 2 последние троичные цифры;
б) если число N на 5 не делится, то остаток от деления умножается на 7, переводится в троичную запись и дописывается в конец числа.
Полученная таким образом запись является троичной записью искомого числа R.
3. Результат переводится в десятичную систему и выводится на экран.
Например, для исходного числа 1210 = 1103 результатом является число 1101123 = 33810, а для исходного числа 510 = 123 это число 12123 = 5010.
Укажите среднее арифметическое всех N, для которых после обработки с помощью этого алгоритма получается число R меньше 200.
В ответ укажите целую часть.
Решение
🔹 Шаг 1. Перебор чисел и троичная запись
def f3(x):
s = ''
while x:
x, ost = divmod(x, 3)
s += str(ost)
return s[::-1]
for N in range(1, 20):
s = f3(N)
print(N, '→', s)
📌 Результат: 1 → 1, 2 → 2, 3 → 10, 19 → 201 и т.д.
🔹 Шаг 2. Проверка делимости на 5
def f3(x):
s = ''
while x:
x, ost = divmod(x, 3)
s += str(ost)
return s[::-1]
for N in range(1, 20):
s = f3(N)
if N % 5 == 0:
print(N, s, 'делится на 5')
else:
print(N, s, 'НЕ делится на 5')
📌 Результат: 1 1 НЕ делится на 5, 2 2 НЕ делится на 5, 3 10 НЕ делится на 5, 19 201 НЕ делится на 5 и т.д.
🔹 Шаг 3. Изменение троичной строки
def f3(x):
s = ''
while x:
x, ost = divmod(x, 3)
s += str(ost)
return s[::-1]
for N in range(1, 20):
s = f3(N)
if N % 5 == 0:
s_new = s + s[-2:]
print(N, s, '→', s_new, '(приписали последние 2 троичные цифры)')
else:
r = (N % 5) * 7
s_new = s + f3(r)
print(N, s, '→', s_new, f'(приписали {f3(r)})')
📌 Результат: 1 1 → 121 (приписали 21), 2 2 → 2112 (приписали 112), 3 10 → 10210 (приписали 210), 19 201 → 2011001 (приписали 1001) и т.д.
🔹 Шаг 4. Перевод обратно в десятичное число
def f3(x):
s = ''
while x:
x, ost = divmod(x, 3)
s += str(ost)
return s[::-1]
for N in range(1, 20):
s = f3(N)
if N % 5 == 0:
s = s + s[-2:]
else:
r = (N % 5) * 7
s = s + f3(r)
R = int(s, 3)
print(N, '→', s, '→', R)
📌 Результат: 1 → 121 → 16, 2 → 2112 → 68, 3 → 10210 → 102, 19 → 2011001 → 1567 и т.д.
🔹 Шаг 5. Среднее арифметическое N, при которых R < 200
Цель: собрать всё вместе и понять задачу целиком.
def f3(x):
s = ''
while x:
x, ost = divmod(x, 3)
s += str(ost)
return s[::-1]
nums = []
for N in range(1, 1000):
s = f3(N)
if N % 5 == 0:
s = s + s[-2:]
else:
s = s + f3((N % 5) * 7)
R = int(s, 3)
if R < 200:
nums.append(N)
print(int(sum(nums) / len(nums)))
📌 Результат: среднее арифметическое всех N, для которых R < 200 (целая часть). Ответ: 10.