思路:
一个n的阶乘未尾有多少个 0 取决于 1 到 n 的各个因子中 2 和 5 的个数,而2的个数是远远多于5的个数的,因此求出5的个数即可。
题解中给出的求解因子 5 的个数的方法是用 n 不断除以 5, 直到结果为 0,然后把中间得到的结果累加. 例如, 100/5 = 20, 20/5 = 4, 4/5 = 0
则 1 到 100 中因子 5 的个数为 (20 + 4 + 0) = 24 个
即 100 的阶乘末尾有 24 个 0. 其实不断除以 5
是因为每个间隔 5 个数有一个数可以被 5 整除,然后在这些可以被 5 整除的数中,每间隔 5 个数又有一个可以被 25 整除,故要再除一次,....直到结果为0,表示没有能继续被除 5 整数的数了:
static void Main(string[] args)
{
while (true)
{
long n = Convert.ToInt64(Console.ReadLine());
long r = TrailingZerosA(n);
Console.WriteLine(n + " 阶乘中尾部的零的个数为:" + r);
}
Console.ReadKey();
}
private static long TrailingZeros(long n)
{
long num = 0;
while(n != 0)
{
num += n / 5;
n /= 5;
}
return num;
}
private static long TrailingZerosA(long n)
{
long i, mod5, d5, count0 = 0;
for (i = 1; i <= n; i++)
{
mod5 = i % 5;
d5 = i / 5;
while (mod5 == 0)
{
count0++;
mod5 = d5 % 5;
d5 = d5 / 5;
}
}
return count0;
}