100000! содержит "всего" 456574 цифр, так что по крайней мере имеет смысл попытаться начать решать задачу.
Вот наивный алгоритм, который вычисляет факториал по определению (n! = 1 * 2 * 3 * ... * n):
Код (Python 3):
prod = 1
for i in range(1, 100000 + 1):
prod *= i
Количество нулей в конце в числе prod можно найти, например, так (результат находится в переменной count):
Код (Python 3):
count = 0
while prod % 10 == 0:
count += 1
prod //= 10
Наконец, проверим, сколько времени считался результат. Импортируем из модуля time функцию perf_counter, запустим её в начале программы и в конце. Разность результатов - время работы программы в секундах.
Итого получаем такую программу:
Код (Python 3):
from time import perf_counter
start = perf_counter()
prod = 1
for i in range(1, 100000 + 1):
prod *= i
print(prod)
count = 0
while prod % 10 == 0:
count += 1
prod //= 10
print(count)
end = perf_counter()
print(end - start)
Вывод полностью приводить не буду, скажу только, что вычисление на моём компьютере заняло меньше 15 секунд.
5
Объяснение:
Маска в двоичном представлении - это 32 бита, первые несколько бит равны 1, остальные 0. Адрес сети из адреса узла получается побитовым И, то есть IP адрес переводится в двоичную форму, и вычисляется побитовое И с соответствующим битом маски.
Переводим IP узла и адрес сети в двоичную форму (можно сообразить, что достаточно перевести только второй справа байт)
159.152.66.19 = ... . ... . 01000010 . ...
159.152.64.0 = ... . ... . 01000000 . ...
Побитовое И работает так: 1 И 1 = 1, все остальные комбинации 0.
01 в начале должно сохраниться, поэтому второй страва байт маски начинается на 11.
10 в конце должно превратиться в 00, поэтому второй справа байт маски оканчивается на 00.
На оставшихся местах 0 превратился в 0, так что в маске может быть как 0, так и 1.
Вот все возможные варианты маски:
(16 единиц) 11000000 (8 нулей)
(16 единиц) 11100000 (8 нулей)
(16 единиц) 11110000 (8 нулей)
(16 единиц) 11111000 (8 нулей)
(16 единиц) 11111100 (8 нулей)