1 Востаннє редагувалося Eff1c (14.04.2020 14:21:04)

Тема: while з умовою "поки вводять дані"

Ось задачка з e-olymp - https://www.e-olymp.com/uk/problems/1598
Проблема: не знаю як вказати умову while (не вказана кількість вхідних даних)
Грався з wlile True і while main(input()), але нічого не виходить
Мій код:

from math import ceil, floor  # заокруглення ceil - до більшого, floor - до меншого

def main(arr):
    neededFood, n, price = map(int, arr.split())
    eat = 0
    min_day = ceil(neededFood/n)  #  мінімальна (на даний момент максимальна, для подальшого порівняння і заміну на меншу) кількість днів для збору їжі
    for i in range(1, min_day + 0):
        if min_day < i:
            break  #  якщо мінімальна кількість днів менша за поточний день
        eat += n
        x = ceil((neededFood - eat) / n) + i
        if x < min_day:
            min_day = x
        n += floor(eat / price)
        eat %= price
    print(min_day)


while main(input()):
    pass;

P's. На с++ це виглядає так:

while (scanf("%d %d %d", &neededFood, &n, &price) == 3)

2 Востаннє редагувалося koala (14.04.2020 14:47:44)

Re: while з умовою "поки вводять дані"

while(scanf(...)) працює, бо scanf повертає кількість розпізнаних токенів.
У вас main (невдала назва) нічого не повертає, тобто повертає None - а while None не повторить виклик. Щось повертайте, залежно від вмісту input(). Наприклад, просто обробляйте ValueError навколо while, в Python це досі вважалося прийнятним. Або повертайте False, якщо input() не повернув нічого, і True, якщо все пройшло добре, в кінці функції.

Подякували: leofun01, Eff1c2

3

Re: while з умовою "поки вводять дані"

Дякую)
Кінцевий код:

from math import ceil, floor  # заокруглення ceil - до більшого, floor - до меншого

def main(arr):
    neededFood, n, price = map(int, arr.split())
    eat = 0
    min_day = ceil(neededFood/n)  #  мінімальна (на даний момент максимальна, для подальшого порівняння і заміну на меншу) кількість днів для збору їжі
    for i in range(1, min_day + 0):
        if min_day < i:
            break  #  якщо мінімальна кількість днів менша за поточний день
        eat += n
        x = ceil((neededFood - eat) / n) + i
        if x < min_day:
            min_day = x
        n += floor(eat / price)
        eat %= price
    print(min_day)
    return True


try:
    while main(input()):
        pass;
except:
    pass;