N!

#include <stdio.h>
#include <string.h>
#define MOD 10000
int main()
{
    int a[10000],b[6],c[10000];//10000!大概有10000*4=40000位,4位一存,数组大小需要开40000/4=10000的大小
    int i,j,k,n,l,la,lb,lc;

    while(EOF !=scanf("%d",&n))
    {
        if(n==0||n==1) {printf("1\n");continue;} //几种特殊情况

        for(a[0]=1, la=1, k=2; k<=n; k++)
        {
            for(l=k,lb=0,i=0; l; i++) { b[i] = l%MOD; l/=MOD;lb++;}

            memset(c,0,sizeof(c));
            for(j=0; j<lb; j++)
                for(i=0; i<la; i++)
                {
                    c[j+i] += b[j]*a[i];
                    c[j+i+1] += c[j+i]/MOD;
                    c[j+i] %= MOD;
                }
            la = la+lb; //两个数相乘,假设a有4位,b有2位,那么a*b可能是5位或者6位,先假设有6位
            if(0 == c[la-1]) la--; //看一下有没有第六位,第六位即c[5]

            for(i=0; i<la; i++) a[i] = c[i];
        }

        printf("%d",a[la-1]);
        for(i=la-2; i>=0; i--)
            printf("%04d",a[i]);
        printf("\n");
    }
    return 0;
}

posted @ 2013-08-04 17:04  hpu张亚飞  阅读(438)  评论(0编辑  收藏  举报