502
题目思路:
尾部零, 就是看乘积中能组成 10 的个数有多少个, 可以是 1*10,2*5. 我们在前 N 个数中, 能够拆分得到 2 的个数比 5 多, 然后我们只要看有多少个数能拆分得到 5 就行了, 这样恰好就包含了 1*10 的情况.
这样这个问题就变成了前 N 个数中有多少个数能拆分得到 5.
也就是算前 N 个数中, 是 5 的倍数的个数 + 是 5*5 的倍数的个数 + 是 5*5*5 的倍数的个数.....(以此类推)(5^x 小于等于 N)
为了描述的更清楚, 我们可以在草稿纸上画一个 1~N 的坐标轴, 每次圈出 5 的倍数的点 (比如说 5,10,15.......), 再圈出 5*5 的倍数的点.......(以此类推).
这样, 我们发现 5 只划记了一次, 25 就划记了两次...... 刚好把每个数出现的次数表示出来了.
代码:
- #include <stdio.h>
- int main()
- {
- int n, s = 0, t = 1;
- scanf("%d", &n);
- while (t <= n)
- {
- t = t * 5;
- s = s + n / t;
- }
- printf("%d\n", s);
- return 0;
- }
听说, 点赞的人题题 AC, 快试试吧!
此题为分支, 根部网址:
来源: http://www.bubuko.com/infodetail-3520223.html