求N!末尾有多少个0,首先想到0出现的条件,因为10的因子有(2,5) (1,10)
所以出现0,必须为5和一个偶数相乘或者10的整数倍和任意一个数相乘
而10的整数倍又可以看做5和一个偶数相乘的结果
因为一个数中偶数一定比5多,因此判断一个数中含有多少个5即可!
那么只是简单除以5对不对呢?不对!因为数目中可能含有5的阶乘,如25,125
所以要一直除以5直到小于5,而把这个过程中的商加起来,就是所含5的个数!
刚开始的想法就是模拟阶乘求解过程,判断每次相乘后是否为10的倍数,之后再取余数继续下一步
现在想想这样做肯定是错的,因为给出一个1000000000就超时了
代码如下:
#include <stdio.h>
int main(void) {
int n, T, ans;
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
ans = 0;
while(n) {
n /= 5;
ans += n;
}
printf("%d\n", ans);
}
return 0;
}