nefu 118 n!后面有多少个0 算数基本定理,素数分解

n!后面有多少个0

Time Limit 1000ms

Memory Limit 65536K

description

从输入中读取一个数n,求出n!中末尾0的个数。
							

input

输入有若干行。第一行上有一个整数m,指明接下来的数字的个数。然后是m行,每一行包含一个确定的正整数n,1<=n<=1000000000。

output

对输入行中的每一个数据n,输出一行,其内容是n!中末尾0的个数。

sample_input

3
3
100
1024

sample_output

0
24
253

考查的素数基本定理的性质,素数基本定理:每个大于1的正整数n都能被唯一地写成素数的乘积,在乘积中的素因子按照非降序排列,n=(p1^a1)*(p2^a2)*.....*(pk^ak).

n!的素因子分解中的素数p的幂为: [n/p]+[n/p^2]+[n/p^3]+.........

再看这个题,说n!后面有几个0,显然我们不能算出n!,所以我们得找特征。

对于任意一个正整数,若对其进行因式分解,那么其末尾的0必定可以分解成2*5,所以每一个0必然和一个5对应,但同时还需要有2才行。而对于n!,在因式分解中,因子2的个数要比因子5的个数多,所以如果存在一个因子5,那么它必然对应着n!末尾的一个0,那么本题就变为求n!的分解中因子5的个数,那么上面的公式就派的上用场了。

代码如下:

#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
	int i,j,s,n;
	int cas,ans,t;
	scanf("%d",&cas);
	while(cas--)
	{
		scanf("%d",&n);
		s=5;ans=0;t=n/5;
		while(t!=0)
		{
			ans+=t;
			s*=5;
			t=n/s;
		}
		printf("%d\n",ans);
	}
	return 0;
}


你可能感兴趣的:(数论)