附加题: 很多头发
题目描述
王师傅的理发店生意逐渐红火,理发店地上每天要清理的头发也越来越多,王师傅发现在第n天,地上头发的数目为N = n!(n的阶乘),你的任务是计算第n天,头发数目N的末尾有多少个零。
例如在第6天,N = 6*5*4*3*2*1 = 720, 末尾有1个零,输出1。
关于输入
有多组测试数据
第一行给出一个整数T,代表数据的个数
随后T行每行为一个整数n,1<=n<=2147483647
关于输出
对于每个输入数据n,输出N = n!的末尾零的个数,每组数据之间换行
例子输入
3 3 10 20
例子输出
0 2 4
提示信息
阶乘的增长速度极快,13的阶乘已经超过int能表示的范围,为了正确输出结果,请不要使用暴力
解题分析
这个问题涉及计算阶乘的末尾零的个数。末尾零的个数实际上由质因子2和5的个数决定,因为2和5相乘得到10,而10的倍数末尾都有零。
在阶乘中,2的个数明显多于5的个数,所以问题可以简化为计算阶乘中5的个数。具体地,每隔5个数会有一个含有因子5的数字,每隔25个数会有一个额外的含有因子5的数字,每隔125个数又会有一个额外的含有因子5的数字,以此类推。
代码实现
#include <stdio.h>
// 计算含有5的个数
int countZeros(int n) {
int count = 0;
while (n > 0) {
n /= 5;
count += n;
}
return count;
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
int n;
scanf("%d", &n);
// 计算阶乘末尾零的个数
int zeros = countZeros(n);
// 输出结果
printf("%d\n", zeros);
}
return 0;
}