Ошибка в решении 5 задачи ЕГЭ
Не то чтобы задача была сложной(решать такие задачки нужно максимум за 8 минут), но у меня какой-то глюк мозга и я не могу найти ошибку.
Текст задачи:
На вход алгоритма подаётся натуральное число N. Алгоритм строит по нему новое число R следующим образом.
1. Строится троичная запись числа N.
2. Далее эта запись обрабатывается по следующему правилу:
а) если число N делится на 3, то к этой записи дописываются две последние троичные цифры;
б) если число N на 3 не делится, то остаток от деления умножается на 5, переводится в троичную запись и дописывается в конец числа.
Полученная таким образом запись является троичной записью искомого числа R.
3. Результат переводится в десятичную систему и выводится на экран.
Например, для исходного числа 11 = 1023 результатом является число 1021013 = 307, а для исходного числа 12 = 1103 это число 110103 = 111.
Укажите минимальное число R, большее 133, которое может быть получено с помощью описанного алгоритма. В ответе запишите это число в десятичной системе счисления.
Сам ответ: 141
Я сделал так: http s://pym.dev/p/2pj9q/
#Перевод в троичную
def p(n):
s = ""
while n > 0:
s = str(n%3) + s
n = n // 3
return s
#Сам алгоритм из задания
def F(n):
s = p(n)
if(n%3==0):
s = s + s[len(s)-2:len(s)]
return int(s,3)
else:
k = (n % 3)*5
s2 = p(k)
s = s + s2
return int(s,3)
#Перебор
for i in range(134,1000):
if(int(F(i))>133):
print(i)
break
print(F(11))
Но что-то идёт не так. Скорее всего проблема в самом алгоритме, но в чём именно? Помогите пожалуйста разобраться.
Если нужен изначальный текст задачи, то на сайте http s:// kompege.ru/task это номер 9774
# Исправленный алгоритм из задачи
def F(n):
s = p(n)
if n % 3 == 0:
s = s + s[-2:] # Добавляем две последние цифры
else:
k = (n % 3) * 5
s2 = p(k)
s = s + s2 # Добавляем троичную запись остатка
return int(s, 3)
# Перебор
for i in range(134, 1000):
if int(F(i)) > 133:
print(i)
break
def p(n):
s = ""
while n > 0:
s = str(n % 3) + s
n = n // 3
return s
def F(n):
s = p(n)
if n % 3 == 0:
s += s[-2:] # Добавляем две последние цифры к троичной записи
else:
k = (n % 3) * 5
s2 = p(k)
s += s2
return int(s, 3)
# Перебор
for i in range(134, 1000):
if F(i) > 133:
print(i)
break
def f(n, osn): #функция перевода числа n в сс с основанием osn
s = ""
while n > 0:
s += str(n % osn)
n //= osn
s = s[::-1]
return s
for n in range(1,13):
s = f(n, 3) #переводим число в троичную систему счисления
if n%3==0:
r=s+s[-2:]
if n%3!=0:
k=(n%3)*5
s1=f(k, 3)
r=s+s1
r=int(r,3)
if r>133:
print(r)
break
Ответ: 145