nyoj1026阶乘末尾非0

来源:互联网 发布:淘宝卖的photoshop 编辑:程序博客网 时间:2024/06/05 01:10

阶乘末尾非0

时间限制:2000 ms  |  内存限制:65535 KB
难度:3
描述
我们的问题很是简单,n!末尾非0数是几?
比如n=5的时候,n!=120,那么n!末尾非0数是2.
输入
多组数据,
每组数据占一行,每行一个整数0<=n<=10^1000
输出
n!末尾非0数。
样例输入
5
样例输出

2

//网上的模板.................

/*==================================================*\| 阶乘最后非零位,复杂度 O(nlogn)\*==================================================*///返回该位, n 以字符串方式传入#include <string.h>#include <stdio.h>#define MAXN 10000int a[MAXN];char str[MAXN];const int mod[20]={1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2};int lastdigit(char* buf){int len=strlen(buf),i,c,ret=1;if (len==1) return mod[buf[0]-'0'];for (i=0;i<len;i++) a[i]=buf[len-1-i]-'0';for (;len;len-=!a[len-1]){ret=ret*mod[a[1]%2*10+a[0]]%5;for (c=0,i=len-1;i>=0;i--)c=c*10+a[i],a[i]=c/5,c%=5;}return ret+ret%2*5;}int main(){while(scanf("%s", str) == 1){printf("%d\n", lastdigit(str));}return 0;}

 //解题里面的代码,用时较少#include <string.h>#include <stdio.h>int fact[10]={1,1,2,6,4,6,2,4,8};char str[1010];int str10[1500];int main(){    while(~scanf("%s",str))    {        if (strcmp(str,"1")>0){            int i,j,prod=1,r=-1,sum=0,mod=0,tem;            int len=strlen(str);            for (i = 0; i < len; ++i)   str10[i]=str[i]-'0';            for (i=0; i<len; i+=(!str10[i])){                for (j = i,mod=0; j < len; ++j){                    tem=str10[j];                    str10[j]=(mod<<1)+(str10[j]>4);                    mod=tem%5;                }                sum+=(++r)*mod;                prod=prod*fact[mod]%10;            }            printf("%d\n", fact[sum%4+5]*prod%10);            continue;        }        printf("%d\n",1);    }}        


0 0