回复 41楼 Devon_Ye
											对L5求余就是要截取后5位,对L5整除就是要前5位,int在10进制里最大数是10位。
/*高精度阶乘和注释版 2010-02-01 */ 
#define L5 100000
  //每个结果所占的位数,因为int是10位,所以我取一半5位,如果算到1000位阶乘5*4=9这样两个数相乘不会超界。 
#define N 1001
     //要算的位数+1
#include<stdio.h>
static num[N][L5];
        //这里L5还得有点大了,其实用不上
void BigFac(int n);
        //算n!放到num[n][1]里 
int main(void)
{
    int tp, n, bt, ap;
    
    scanf("%d", &n);
    
    for(tp = n; tp > 0; tp--)
    //算n! 
    BigFac(tp);
    for(ap = 2; ap <= n; ap++)
        //把结果分别加上,把i-1加到i上,i从2直加到n
    {
        for(bt = 1; bt-1 <= *num[ap-1]; bt++) //大整数加法 
        {
            num[ap][bt] += num[ap-1][bt];
                    
            tp = num[ap][bt] / L5;
        //作加法还是可能大于5位于是再截取,和乘法一样 
            num[ap][bt] %= L5;
            num[ap][bt+1] += tp;
        }
    }
    printf("%d", num[n][(*num[n])--]);
    //先输出第一个因为第一个有可能0开头 
    for(;*num[n]>0;--*num[n])
            //用num[n][0]分别输出数据 
        printf("%05d",num[n][*num[n]]);
    printf("\n");
    return 0; 
}
void BigFac(int n)
        //用于算n!的
{
    long tpnum;
    int i, j, add = 0;
    
    num[n][0] = num[n][1] = 1;
        //num[n][0]存放有多少个5位的存放数据 
    for(i = 2; i <= n; i++)
            //num[n][1]以后都是存放结果 
    {
        for(j = 1; j <= *num[n]; j++)
        {
            tpnum
  = num[n][j]*i + add;
            num[n][j] = tpnum % L5;
    //对L5求余的目的是截取后5位 
            add
    = tpnum / L5;
    //整除的目的就是要前5位,add存放进位 
        }
        while(add)
                    //有进位就加上 
        {
            num[n][++(*num[n])] = add % L5;
            add /= L5;
        }
    }
}