基本思路采用累乘的方法,乘法笔算的思路,数组记录下所有乘积的位,我写了个具体如下:
#include
int xcfun(int x[],int d[],int ws[],int j,int jw,int len)//模拟笔算乘法,逐位相乘
{
int k=0;
do
{
x[k+j]=(ws[j]*d[k]+jw)%10;
jw=(ws[j]*d[k]+jw)/10;
k++;
}while(d[k]>-1);
if(jw!=0)
{
x[k+j]=jw;
k++;
};
if(k+j>len)len=k+j;
return len;
}
main()
{
int a[2000],b[2000],c[2000],e[2000],d[2000],ws[4];
int i,j,k,jw,len;
for(k=0;k<2000;k++){d[k]=-1;}
d[0]=1;
for(i=1;i<=100;i++)//求100的阶乘
{
ws[0]=i%1000%100%10;
ws[1]=i%1000%100/10;
ws[2]=i%1000/100;
ws[3]=i/1000;
//printf("%d %d %d\n",ws[0],ws[1],ws[2]);
for(k=0;k<2000;k++){a[k]=0;b[k]=0;c[k]=0;e[k]=0;}
len=0;
for(j=0;j<4;j++)
{
k=0,jw=0;//位数,进位
if(ws[j]!=0 && j==0)
{ len=xcfun(a,d,ws,j,jw,len); /*xcfun函数在判断里的效果 do { a[k]=(ws[j]*d[k]+jw)%10; jw=(ws[j]*d[k]+jw)/10; k++; }while(d[k]>-1); if(jw!=0) { a[k]=jw; k++; } if(k>len)len=k; */
}
else if(ws[j]!=0 && j==1) len=xcfun(b,d,ws,j,jw,len);
else if(ws[j]!=0 && j==2) len=xcfun(c,d,ws,j,jw,len);
else if(ws[j]!=0 && j==3) len=xcfun(e,d,ws,j,jw,len);
}
jw=0;
for(j=0;j
{
//if(i==22)printf("%d,%d,%d\n",a[j],b[j],c[j]);
d[j]=(a[j]+b[j]+c[j]+e[j]+jw)%10;
jw=(a[j]+b[j]+c[j]+e[j]+jw)/10;
}
if(jw!=0)d[j++]=jw;
printf("%d的阶乘:",i);
for(k=j-1;k>-1;k--)printf("%d",d[k]);//输出得数
printf("\n");
//getch();
}
}