下面是1!+2!+3!+4!+4!+!+6!……+N!的源代码里面有很大数的阶乘的算法主要是按位算,那么大的数,肯定不能几个字节来存放 #include<stdio.h> /*注释,对算法可能还表达还不是很完全*/#define N 2500 /*为了方便,把两个空间设为一样大,可以调整,以提高速度。不一定*/long int a[N]={0}; /*运算阶乘的空间*/long int b[N]={0}; /*盛放最后的结果*/long int m; /*特殊算法产生的中间量,表示进位*/long int g=0; /*输入的数*/main(){ headprint(); /*调用头输出*/ yunsuan(); /*运算*/ print(); /*输出*/} /***********头输出文件,声明作者版权,采集少量数据*******/int headprint() { printf("Thanks to use this software!\n"); printf("It can help you to finish the following function:\n"); printf("F(n)=1!+2!+3!+......+(n-1)!+n!\n"); /*以上皆是友情提示*/ printf("Please enter the n:\n"); scanf("%ld",&g); getchar(); /*核心*/ printf("running........\nPlease wait!\n"); } /*********计算程序部分************/int yunsuan() { int i,j; for(i=1;i<=g;i++) /*运 算 主 循 环 */ { if(i<g) /*up*/ printf("run %d\r",i); /*显示当前运行的数据,主要是有点慢,等得不耐烦,就加了这个显示*/ if(i==g) /*up与down之间的这一段,是为了显示,与运算无关*/ printf("Finish %d\n",i); /*down*/ jiecheng(&i); /*调用阶乘计算*/ qiuhe(); /*调用求和运算*/ } } /*******计算阶乘*******/int jiecheng(int *p) { int i,j; for(i=0;i<N;i++) /*把运算空间清零,防止造成错误*/ a[i]=0; a[N-1]=1; /* 阶乘空间第一位(在数组中就是最后一位了)初始化为1,,要不然就没办法阶乘了,都是零*/ for(i=1;i<=*p;i++) /*阶乘主循环*/ { for(j=N-1;j>=0;j--) /*每一位都乘阶乘数*/ { if(a[j]!=0||m!=0||a[j-1]!=0) { a[j]=i*a[j]+m; /*m:前一组数据传过来的进位*/ m=0; /*进位清零,其数据已经加入到数组数据中*/ if(a[j]>9999) /*为了防止数据溢出,因为乘法会产生很大数,保守起见设最大数为9999*/ { m=a[j]/10000; /*将超过的数据放在m中*/ a[j]=a[j]%10000; /*取出数据中除去超出范围的数后,剩余的数*/ } } } } } /*********把结果求和*****/int qiuhe() { int i,j; for(i=N-1;i>=0;i--) /*求和主循环*/ { b[i]=b[i]+a[i]+m; /*过程与阶乘相似,不过这次是加法了*/ m=0; if(b[i]>9999) /*为了保证加法时不会错位,只好把b的最大数也设成9999了*/ { m=b[i]/10000; b[i]=b[i]%10000; /*一样*/ } } } /**********输出部分********/int print() { int i,j; FILE *fp; if((fp=fopen("001","w"))==NULL) /*打开文件*/ printf("Can't open this file!\n"); for(i=0;i<N;i++) if(b[i]) break; for(;i<N;i++) /*此时就不用再设定i值了*/ { printf("%ld",b[i]); /*输出到显示器*/ fprintf(fp,"%ld",b[i]); /*输出到文件*/ } fclose(fp); /*关闭文件,经常忘了~嘿嘿~*/ printf("\n\nThe file '001' has been outputted!\n\n"); /*提示*/ getchar(); }

评论