阶乘的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)
阶乘中存在因子 5 的或者是末位含有5的,那么最后的阶乘乘积中一定会有0的存在,
即 2*5,即使是4*5 最终也是分解成2*2*5;显然任意给定一个数,
最后的因式分解中5的个数要比2少 ,所以只要知道最后分解的因式
中5的个数和末位含5的个数的和就是最后阶乘中末位含0的个数,
例如:
20! = 2432902008176640000; 末位4个0
因式中有 5 10 15 20
可分解为 1*5 2*5 3*5 4*5
所以5的个数一共是4,即阶乘最后又4个0。
25!= 15511210043330985984000000; 末位6个0;
式中有 5 10 15 20 25
可分解为 1*5 2*5 3*5 4*5 5*5 其中25末位含0
所以5的个数一共是6,即阶乘最后又6个0。
代码中给出了两种方法,其原理是一样的
具体代码:
#include <stdio.h>
int main()
{
int T,n,sum;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
sum=0;
// 方法一
// while(n>=5)
// {
// sum+=n/5;//每次累加 n 这个数中含5的个数
// n/=5;//上面 n已经统计过,所以此处要对5取整向下计算
// }
// 放法二
int b=1;
while(1)
{
b*=5;//5的次方,只有5的次方的阶乘时,末位的 0 才会比它之前相邻的多1
sum+=n/b;//同方法一
if(b>n)//大于n 退出循环
break;
}
printf("%d\n",sum);
}
return 0;
}