Оптимальное решение выполняется за O(log N)
время, где N
- это число, для которого вы хотите найти нули.Используйте эту формулу:
Zeroes(N!) = N / 5 + N / 25 + N / 125 + ... + N / 5^k
, пока деление не станет 0. Вы можете прочитать больше на wikipedia .
Так, например, в C это будет:
int Zeroes(int N)
{
int ret = 0;
while ( N )
{
ret += N / 5;
N /= 5;
}
return ret;
}
Это будет работать в течение 8 секунд на достаточно быстром компьютере.Вероятно, вы можете ускорить его с помощью справочных таблиц, хотя я не уверен, сколько у вас памяти.
Вот еще одно предложение: не храните числа, они вам не нужны!Подсчитайте количество нулей для каждого числа, когда вы читаете его.
Если это для онлайн-судьи, то, по моему опыту, онлайн-судьи преувеличивают временные рамки для проблем, поэтому вам придется прибегать к уродливым взломам, даже если у вас есть правильный алгоритм.Один из таких уродливых способов - не использовать такие функции, как cin
и scanf
, а вместо этого использовать fread
для одновременного чтения группы данных в массиве char, а затем анализировать эти данные (НЕ использовать sscanf или stringstreamsхотя) и получить цифры из него.Уродливо, но обычно намного быстрее.