去评论
推扬网

陈可雯:用C语言编写程序,求出1000的阶乘.(利用数组)

admin
2020/08/11 18:49:34

预言家晚报的回答:

基本思路采用累乘的方法,乘法笔算的思路,数组记录下所有乘积的位,我写了个具体如下:

 #include <stdio.h> 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<len;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();  } }