阶乘的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
-
第一行输入一个整数N表示测试数据的组数(1<=N<=100)
这题我其实想了一会,因为M的范围很大,不可能直接把M的阶乘算出来在去计算末尾的0……但是但是我不表示想不到用其他的方法了……
然后在网上看了题解:
令f(x)表示正整数x末尾所含有的“0”的个数,则有:
当0 < n < 5时,f(n!) = 0;
当n >= 5时,f(n!) = k + f(k!), 其中 k = n / 5(取整)。
我这样的数学学渣实在是不想看证明过程……,先贴上吧:点击打开链接
有了公式代码就很好写了, 我是用递归写的。 做完这一题又深深的觉得数学对于写代码真的很重要……哎哎,加油吧
#include <stdio.h>
//当0 < n < 5时,f(n!) = 0;
//当n >= 5时,f(n!) = k + f(k!), 其中 k = n / 5(取整)。
int f(int n)
{
if(n >0 && n < 5)
return 0;
int temp = n / 5;
return temp + f(temp);
}
int main (void)
{
int n, m;
scanf("%d", &n);
while(n --)
{
scanf("%d", &m);
printf("%d\n", f(m));
}
return 0;
}