陈可雯:用C语言编写程序,求出1000的阶乘.(利用数组)
预言家晚报的回答:
基本思路采用累乘的方法,乘法笔算的思路,数组记录下所有乘积的位,我写了个具体如下:
#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(); } }