Выражение неизвестной через цикл на python
Определите, при каком наибольшем введённом значении переменной s программа выведет число 64. Для Вашего удобства программа представлена на четырёх языках программирования. Демо егэ по информатике.
s = int(input())
s = s // 10
n = 1
while s < 51:
s = s + 5
n = n * 2
print(n)
Как реализовать программу через поиск s, приняв n за известную?
Мои попытки:
1.
s = 50
n = 64
while n != 1:
s -=5
n /= 2
print(s)
s = 20
n = 1
while s < 51:
s = s + 5
n = n * 2
print(s)
Ответы (2 шт):
Как вариант:
from math import log
n = 64
mult_n = 2 # на сколько умножаем n
max_s = 51-1 # s < 51
step_s = 5 # s = s + 5
p = int(log(n, mult_n))
print((max_s-step_s*(p-1))*10+9)
Для экономии времени при больших n имеет смысл вывод сделать так:
print(f'{max_s-step_s*(p-1)}9')
Без модуля math:
def log(x, y):
r, c = 1, 0
while r!=x:
r *= y
c += 1
return c
def check(s):
s //= 10
n = 1
while s < 51:
s += 5
n *= 2
return n==64
for i in range(519, -1, -1):
if check(i):
break
print(f'Наибольшее s: {i}')
поскольку ограничения по времени нет, то попробуем перебором через цикл:
def foo(s):
#s = int(input())
s = s // 10
n = 1
while s < 51:
s = s + 5
n = n * 2
if n==64:return 64
m=0
for i in range (0,519+1):
if foo(i)==64:
m=i
print('наибольшее число:',m)
даны расчёты, их оформляем как функцию.инпут заменяет аргумент функции. далее простым циклом от 0 до 519 перебирвем варианты. m=i без проверки что m больше чем предыдущая изза цикла-он идёт всегда по возрастанию и последнее i будет максимальным.
for i in range (519,8,-1):
if foo(i)==64:
m=i
break
немного оптимизации, как подсказали в комментарии-пустить цикл в обратном направлении.при нахождении ответа сразу завершаем.