Как переписать решение без использования циклов?
Задача из олимпиады 8 класс
Имеется N кг металлического сплава. Из него изготавливают заготовки массой K кг каждая. После этого из каждой заготовки вытачиваются детали массой M кг каждая (из каждой заготовки вытачивают максимально возможное количество деталей).
Если от заготовок после этого что-то остается, то этот материал возвращают к началу производственного цикла и сплавляют с тем, что осталось при изготовлении заготовок. Если того сплава, который получился, достаточно для изготовления хотя бы одной заготовки, то из него снова изготавливают заготовки, из них — детали и т.д.
Напишите программу, которая вычислит, какое количество деталей может быть получено по этой технологии из имеющихся исходно N кг сплава.
Программа получает на вход три натуральных числа N, K, M.
Выведите одно число — количество деталей, которое может получиться по такой технологии.
Запрещено использовать циклы(
Смог написать только с использованием цикла:
N = int(input())
K = int(input())
M = int(input())
count_d = 0
while N >= K:
count_z = N // K
count_d += count_z * (K // M)
N -= count_z * (K // M) * M
print(count_d)
Входные данные: 10 5 2 Выходные: 4
Входные данные: 13 5 3 Выходные: 3
Входные данные: 14 5 3 Выходные: 4
Входные данные: 13 9 4 Выходные: 2
Ответы (4 шт):
Ну переделайте цикл на рекурсию (что кстати на практике делать не надо, а даже наоборот рекурсию надо переделать в цикл):
N = int(input())
K = int(input())
M = int(input())
count_d = 0
def f(n):
global N, K, M, count_d
if not (n >= K):
return
count_z = N // K
count_d += count_z * (K // M)
N -= count_z * (K // M) * M
f(N)
f(N)
print(count_d)
P.S. У вас кстати очень неплохой питон. Особенно для восьмиклассника. Кст код, который я написал хуже т.к. он больше юзает стековое пространство и еще использует глобалы. Нo зато — без циклов.
N = int(input())
K = int(input())
M = int(input())
q = K // M
M *= q
print(((N - K + 1) // M + bool((N - K + 1) % M)) * q)
n = int(input())
k = int(input())
m = int(input())
i = k - k % m
n = abs(n - k + i) - i
count = (n // i + 1) * (k // m)
print(count)
Вот решение с использованием модуля
Ответ може и не в тему, но стоит добавить парочку ограничений, чтобы решение проходила несколько стрессс-тестов.
inp_numbers = input()
inp_numbers = inp_numbers.split(' ')
inp_numbers = [int(i) for i in inp_numbers]
n = inp_numbers[0]
k = inp_numbers[1]
m = inp_numbers[2]
if n == 0 or k == 0 or m == 0:
print(0)
elif m > k or k > n or m > n:
print(0)
else:
cnt_pt = 0
while n >= k:
cnt_wp = n // k
cnt_pt += cnt_wp * (k // m)
n -= cnt_wp * (k // m) * m
print(cnt_pt)