На вход алгоритма подаётся натуральное число N.
Алгоритм строит по нему новое число R следующим образом.
1. Строится шестеричная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
а) если число N делится на 3, то к этой записи слева дописывается последняя шестеричная цифра, а справа дописывается 11;
б) если число N на 3 не делится, то остаток от деления умножается на 6, переводится в шестеричную запись и дописывается в конец числа.
Полученная таким образом запись является шестеричной записью искомого числа R.
3. Результат переводится в десятичную систему и выводится на экран.
Например, для исходного числа 1110 = 156 результатом является число 15206 = 40810, а для исходного числа 1210 = 206 — число 020116 = 43910.
Укажите минимальное число R, большее 230, которое может быть получено с помощью описанного алгоритма.
В ответе запишите это число в десятичной системе счисления.
Решение
🔹 Шаг 1. Перебор чисел и шестеричная запись
# перебор чисел и шестеричная запись
def f6(x):
s = ''
while x:
x, ost = divmod(x, 6)
s += str(ost)
return s[::-1] or '0'
for N in range(1, 20):
R = f6(N)
print(N, '→', R)
📌 Результат: 1 → 1, 2 → 2, 3 → 3, 19 → 31 и т.д.
🔹 Шаг 2. Проверка делимости на 3
# проверка делимости на 3
def f6(x):
s = ''
while x:
x, ost = divmod(x, 6)
s += str(ost)
return s[::-1] or '0'
for N in range(1, 20):
R = f6(N)
if N % 3 == 0:
print(N, R, 'делится на 3')
else:
print(N, R, 'НЕ делится на 3')
📌 Результат: 1 1 НЕ делится на 3, 2 2 НЕ делится на 3, 3 3 делится на 3, 19 31 НЕ делится на 3 и т.д.
🔹 Шаг 3. Изменение шестеричной строки
# изменение шестеричной строки
def f6(x):
s = ''
while x:
x, ost = divmod(x, 6)
s += str(ost)
return s[::-1] or '0'
for N in range(1, 20):
R = f6(N)
if N % 3 == 0:
R = R[-1] + R + '11'
print(N, '→', R, '(последняя цифра слева и 11 справа)')
else:
R = R + f6((N % 3) * 6)
print(N, '→', R, f'(приписали {f6((N % 3) * 6)})')
📌 Результат: 1 → 110 (приписали 10), 2 → 220 (приписали 20), 3 → 3311 (последняя цифра слева и 11 справа), 19 → 3110 (приписали 10) и т.д.
🔹 Шаг 4. Перевод обратно в десятичное число
# перевод обратно в десятичное число
def f6(x):
s = ''
while x:
x, ost = divmod(x, 6)
s += str(ost)
return s[::-1] or '0'
for N in range(1, 20):
R = f6(N)
if N % 3 == 0:
R = R[-1] + R + '11'
else:
R = R + f6((N % 3) * 6)
print(N, '→', R, '→', int(R, 6))
📌 Результат: 1 → 110 → 42, 2 → 220 → 84, 3 → 3311 → 763, 19 → 3110 → 690 и т.д.
🔹 Шаг 5. Поиск минимального R, превышающего 230
Цель: собрать всё вместе и понять задачу целиком.
def f6(x):
s = ''
while x:
x, ost = divmod(x, 6)
s += str(ost)
return s[::-1] or '0'
MIN_R = 10 ** 9
for N in range(1, 10000, 1):
R = f6(N)
if N % 3 == 0:
R = R[-1] + R + '11'
else:
R = R + f6((N % 3) * 6)
R = int(R, 6)
if R > 230:
MIN_R = min(R, MIN_R)
print(MIN_R)
📌 Результат: минимальное значение R, превышающее 230 (через MIN_R). Ответ: 258.