欢迎来到天天文库
浏览记录
ID:55896244
大小:238.00 KB
页数:12页
时间:2020-06-13
《n的阶乘程序报告材料.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、HUNANUNIVERSITY程序设计训练报告题目求n!学生学生学号专业班级学院名称指导老师2013年7月11日目录第一部分程序功能简介3第二部分本人完成的主要工作3第三部分设计方案4(一)设计分析4(二)模块的功能及程序说明5(三)核心源程序模块7(四)核心算法流程图8(五)操作方法简介9(六)实验结果9(七)设计体会10第四部分附录11(一)程序中主要变量的功能说明11(二)源程序代码11第一部分程序功能简介该程序是求一个大数n的阶乘(n!),n的值围从1~100之间变化。输出结果从右往左每四个数之间用一个“,”隔开。第二部分本人完成的主
2、要工作刚开始,我尝试着通过递归函数(如下)将100!的结果算出longfac(intn)//函数:n的阶乘{longs;if(n==0
3、
4、n==1)s=1;elses=n*fac(n-1);returns;}结果发现无法得到正确结果(100的阶乘输出为0),询问后知道由于100的阶乘结果太大,用长字符串也会溢出导致无法显示,所以只能将阶乘后结果的个、十、百、千...位依次赋数给数组a[200]来解决这一问题。数组a[200]的引入也让n阶乘结果的位数昭然若揭,又使用for循环使输出结果从右往左每四个数之间用一个“,”隔开。最终设计出一个程序求
5、一个大正整数数的阶乘(n!),n的值围从1~100之间变化(输出结果从右往左每四个数之间用一个“,”隔开)。然后对程序进行编译,运行,并不断完善细节,不断优化。第三部分设计方案(一)设计分析1、解决结果的存放问题由于是求一个大数n的阶乘,结果的很大(会溢出),无法直接输出或得到结果,所以在经过探索及请教同学之后拟定用乘法的基本原理把用户给的数据求得阶乘后的结果的个、十、百、千...位依次赋数给数组a[200]——即a[0]=个位上的数,a[1]=十位上的数.....以此类推。2、结果位数的解决根据数组a中的数据存放情况,从数组最后一位a[]开
6、始,往前依次进行观察,直至a[j]不为零,则证明结果的位数为j+13、“,”隔开根据题目所要求的,输出结果从右往左每四个数之间用一个“,”隔开。分析可知,这是将之前存放在数组a中的数进行规律性输出,最终拟定采用for循环解决。又由于结果除以4的余数不同引起的输出规律有些许差异,最终决定分余数是否为0两种情况来输出最终结果。4、意外处理由于n的值是由操作者输入,需要考虑当输入值超出1~100围时的程序应对方式(告知操作者:输入数据错误)。(二)模块的功能及程序说明/******文件包涵部分******/#include#inc
7、lude/******定义变量部分******/intn;/***定义核心变量n***/inti,j,k=0;/***定义辅助变量***/inta[200]={1},m;/***定义并初始化数组a,其中m=结果的位数除以4的余数***//******获取用户输入的数据******/printf("pleaseinputanumber(1~100)n:");scanf("%d",&n);/******输入数据不合要求时的情况处理******/if(n>100
8、
9、n<1)printf("Sorry!Youenterawro
10、ngnumber.");for(i=1;i<=n;i++){for(j=0;j<200;j++){a[j]*=i;}for(j=0;j<200;j++){a[j+1]+=a[j]/10;a[j]%=10;}}核心上面的这一模块为核心模块,是用乘法的基本原理把用户给的数据求得阶乘后的结果的个、十、百、千...位依次赋数给数组a[200],即a[0]=个位上的数,a[1]=十位上的数.....for(i=199;i>=0;i--){if(a[i]!=0){j=i;break;}}/***求出n阶乘结果的位数减一(结果位数为j+1)***/m=
11、(j+1)%4;/***算出结果的位数除以4的余数***/printf("thefactorialof%dis:",n);/******按要求输出结果******/if(m!=0){for(i=j;i>=0;i--){printf("%d",a[i]);k++;if(k==m)break;}/***输出余数不为零时第一个逗号前的数***/for(i=j-m;i>=0;i--){if((k-m)%4==0)printf(",");printf("%d",a[i]);k++;}printf("");}/*****按要求输出余数不为零时剩下
12、的数*****/else{for(i=j;i>=0;i--){printf("%d",a[i]);k++;if(k%4==0&&k!=j+1)printf(",")
此文档下载收益归作者所有