NYOJ - 阶乘的0

来源:互联网 发布:直播软件制作多少钱 编辑:程序博客网 时间:2024/05/01 21:52

阶乘的0

时间限制:3000 ms  |           内存限制:65535 KB
难度:3
描述
计算n!的十进制表示最后有多少个0
输入
第一行输入一个整数N表示测试数据的组数(1<=N<=100)
每组测试数据占一行,都只有一个整数M(0<=M<=10000000)
输出
输出M的阶乘的十进制表示中最后0的个数
比如5!=120则最后的0的个数为1
样例输入
63601001024234568735373
样例输出
0142425358612183837
 #include <stdio.h>int fact_zero(int n){if(n < 5)return 0;elsereturn n/5+fact_zero(n/5);}int main(){int n,m;scanf("%d",&n);while(n--){scanf("%d",&m);printf("%d\n",fact_zero(m));}}

这题可以根据一个结论来解决,n!0的个数,进一步分析,可以得出考虑25的个数,因为,2是偶数,他是很多数的因数,所以,决定0的个数,现在只需要考虑5的个数,具体的证明如下:

假设 f(n!)表示n!0的个数

1 < n < 5  f(n!) = 0

5 <= n    f(n!) = m+ f(m!) 其中,m = n/5

n! = (5m*5(m-1)*5(m-2)*…..*15 *10*5)*A 其中,A是不含因数是5的整数

n! =5^m*m!*A

f(n!) = m + f(m!)

以上是对公式的分析,这题已经AC了,这里提供参考。

原创粉丝点击