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;} 


原创粉丝点击