阶乘的0
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
计算n!的十进制表示最后有多少个0
-
输入
-
第一行输入一个整数N表示测试数据的组数(1<=N<=100)
每组测试数据占一行,都只有一个整数M(0<=M<=10000000)
输出
-
输出M的阶乘的十进制表示中最后0的个数
比如5!=120则最后的0的个数为1
样例输入
-
6 3 60 100 1024 23456 8735373
样例输出
-
0 14 24 253 5861 2183837
-
#include <stdio.h> int fact_zero(int n) { if(n < 5) return 0; else return 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的个数,进一步分析,可以得出考虑2和5的个数,因为,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了,这里提供参考。
-
第一行输入一个整数N表示测试数据的组数(1<=N<=100)