Factorial hoj poj
来源:互联网 发布:java cutdown 编辑:程序博客网 时间:2024/06/15 21:09
/*怎么说呢。看了两份报告,算是规律吧。10可以分解成2*5,也就是说N!末尾有多少个0就可以分解成多少个5.。特别的,25可以分解成两个5,125可以分解成3个5.所以写法如下。*/#include <stdio.h>int main(){ int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); int num=0; while(n) { num+=n/5; n/=5; } printf("%d\n",num); }}<转载>思路:这么大的数,显然不能用for循环一次算出来的啦,关键在于,末尾的零跟什么有关,可以从10这一因子是怎么得出的入手,10的约数只有2和5,所以看2和5的个数就可以了,首先,从n!里面所有数相乘中能被2整除的数一定比能被5整除的多,所以,问题又简化为n!中有多少个5的倍数了,首先5,10,15,20.。。等都有5,但是会发现25中有两个5, 125中有3个5,。。。所以先计算n/5的个数,此时已经计算了25,125,625.。。。中的5一次了,在计算n/125,此时又顺便把625中的5又计算了一次,依次下去,知道计算到比n小的所有是5的幂的个数,把他们全部相加,就不会漏掉其中的5了,所得的因子5的个数就是n!的末尾零的个数。 提交状况:AC 1次 收获:怎么样把问题简化才是硬道理 #include<stdio.h>#include<stdlib.h> int main(){ int n,i,j,m,s; scanf("%d",&n); for(i=0;i<n;i++) { s=0; scanf("%d",&m); for(j=5;j<=m;j*=5) s=s+m/j; printf("%d\n",s); } return 0;}