HUNAN
UNIVERSIT Y
程序设计训练报告
题 目 求n!
学
生
姓
名
学
生
学
号
专
业
班
级
学
院
名
称
指
导
老
师
2013 年7月11 日
第一部分 程序功能简介 3
第二部分 本人完成的主要工作 3
第三部分 设计方案 4
(一) 设计分析 4
(二) 模块的功能及程序说明 5
(三) 核心源程序模块 7
(四) 核心算法流程图 8
(五) 操作方法简介 9
(六) 实验结果 9
(七) 设计体会 10
第四部分 附录 错误!未定义书签
(一) 程序中主要变量的功能说明 …..… 错误!未定义书签
错误!未定义书签
(二) 源程序代码
第一部分 程序功能简介
该程序是求一个大数n的阶乘(n!), n的值范围从1~100之间变 化。输出结果从右往左每四个数之间用一个“,”隔开。
第二部分 本人完成的主要工作
刚开始,我尝试着通过递归函数(如下)将 100!的结果算出
long fac(int n)〃 函数:n 的
阶乘
{
long s;
if(n==0|| n==1)
s=1;
结果发现无法得到正确结果(100的阶乘输出为0),询问后知道由于
100的阶乘结果太大,用长字符串也会溢出导致无法显示,所以只能 将阶乘后结果的个、十、百、千 … 位依次赋数给数组a[200]来解决 这一问题。
数组a[200]的引入也让n阶乘结果的位数昭然若揭,又使用
for循环使输出结果从右往左每四个数之间用一个“ ,”隔开。
最终设计出一个程序求一个大正整数数的阶乘( n!),n的值 范围从1〜100之间变化(输出结果从右往左每四个数之间用一个
“,”隔开)。然后对程序进行编译,运行,并不断完善细节,
不断优化。
第三部分 设计方案
(一)设计分析
1、解决结果的存放问题
由于是求一个大数n的阶乘,结果的很大(会溢出),无法直 接输出或得到结果,所以在经过探索及请教同学之后拟定用乘法的基 本原理把用户给的数据求得阶乘后的结果的个、十、百、千 … 位依
次赋数给数组a[200] —— 即a[0]=个位上的数,a[1]=十位上的 数••…以此类推。
2、结果位数的解决
根据数组a中的数据存放情况,从数组最后一位a[199]开始, 往前依次进行观察,直至a[j]不为零,则证明结果的位数为j+1
3 、“,”隔开
根据题目所要求的,输出结果从右往左每四个数之间用一个
“,”隔开。分析可知,这是将之前存放在数组 a中的数进行规律 性输出,最终拟定采用for循环解决。又由于结果除以4的余数不同 引起的输出规律有些许差异,最终决定分余数是否为0两种情况来输 出最终结果。
4、意外处理
由于n的值是由操作者输入,需要考虑当输入值超出 1~100
范围时的程序应对方式(告知操作者:输入数据错误)
(二)模块的功能及程序说明
******
文件包涵部分******/
#in elude <>
#in elude v>
******
定义变量部分******
int n;/*** 定义核心变量n ***/
int i,j,k=O;/*** 定义辅助变量 ***/
int a[200]={1},m;
/***定义并初始化数组a ,其中m结果的位数除以4的余数***/
******
获取用户输入的数据******
(1~100) n: \n ");
prin tf("please in put a nu mber sea nf("%d",&n);
*** 输入数据不合要求时的情况处理 ******/
if(n >100|| n<1)
prin tf("Sorry!You en ter a wrong nu mber. \n");
核心
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=(j+1)%4;/***算
n的阶乘程序报告 来自淘豆网m.daumloan.com转载请标明出处.