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