和很多oj一样都有的经典题目,就是求阶乘的尾零有多少个。
这就不能直接求阶乘的值。而是直接求5的倍数的个数就可以了。
数据量很大,有100000个,所以这里使用buffer,调用fread函数,可以大大加速程序。比一般的读写操作快10倍左右呢。
原题:
http://www.codechef.com/problems/FCTRL
#include <stdio.h>
unsigned facZeros(unsigned n)
{
unsigned ans = 0;
for (unsigned i = 5; n / i; i *= 5)
{
ans += n / i;
}
return ans;
}
int Factorial()
{
unsigned T, c = 0, zeros = 0, num = 0;
scanf("%u\n", &T);
char buffer[100000];
while ((c = fread(buffer, 1, 100000, stdin)) > 0)
{
for (unsigned i = 0; i < c; i++)
{
if (buffer[i] == '\n')
{
printf("%u\n", facZeros(num));
num = 0;
}
else
{
num = num * 10 + buffer[i] - '0';
}
}
}
if (0 != num) printf("%u", facZeros(num));
return 0;
}