Monday, June 6, 2011

Задача про шкафчики

Наткнулся сейчас на интересную задачу:
В  одной  из школ  есть  такой  ритуал,  проводящийся  в  последний  день  занятий:  ученики выходят  в  холл  и  стоят  около  своих  шкафчиков,  в  которых  хранится  одежда.
По  первому свистку  каждый  ученик  открывает  свой  шкафчик,  по  второму  свистку  ученики  закрывают четные шкафчики (то есть шкафчики номер 2, 4, 6 и т. д.). По третьему свистку ученики меняют положение дверцы каждого третьего шкафчика, то есть если она была открыта, ее закрывают, а если закрыта — открывают. Это происходит со шкафчиками номер 3, 6, 9 и т.д. По четвертому свистку меняется состояние дверцы каждого четвертого шкафчика, по пятому свистку каждого пятого и т. д. Предположим для простоты, что это небольшая школа и шкафчиков всего 100. По сотому свистку ученик, который стоит рядом со шкафчиком под сотым номером (и только этот ученик),  меняет  положение  дверцы  этого  шкафчика. Сколько  шкафчиков  после  этого оказываются открытыми?

Подумав немного и решив задачку на бумаге, написал программу на Python для её решения.
Внимание! Внизу публикую закономерность.

#--------------------------------------
# Open school lockers counter
#--------------------------------------
""" Get Open Lockers Count """
def open_lockers_counter(n):
    open_count = 0
    for i in range(1, n + 1):
        div_num = 0 # i divisors number   
        for j in range(1, i + 1):
            if i % j == 0:
                div_num += 1
        # if divisors number is odd
        if div_num % 2 != 0:
            open_count += 1
    return open_count;


Закономерность такова: открытыми останутся только те шкафчики, у которых количество делителей нечетное, то есть квадраты чисел (1, 4, 9, 16...). Таким образом ответом является количество квадратов чисел.

No comments:

Post a Comment