HUNAN UNIVERSITY
程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
训练
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
题目
求n!
学生姓名
学生学号
专业班级
学院名称
指导老师
2013 年 7 月 11 日
目 录
第一部分 程序功能简介 3
第二部分 本人完成的主要工作 3
第三部分 设计
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
4
(一)设计分析 4
(二)模块的功能及程序说明 5
(三)核心源程序模块 7
(四)核心算法流程图 8
(五)操作方法简介 9
(六)实验结果 9
(七)设计体会 10
第四部分 附录 11
(一)程序中主要变量的功能说明 11
(二)源程序代码 11
第一部分 程序功能简介
该程序是求一个大数n的阶乘(n!),n的值范围从1~100之间变化。 输出结果从右往左每四个数之间用一个“ ,”隔开。
第二部分 本人完成的主要工作
刚开始,我尝试着通过递归函数(如下)将100!的结果算出
long fac(int n)// 函数:n的阶乘
{
long s;
if(n==0||n==1)
s=1;
else
s=n*fac(n-1);
return s;
}
结果发现无法得到正确结果(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范围时的程序应对方式(告知操作者:输入数据错误)。
(二)模块的功能及程序说明
/****** 文件包涵部分 ******/
#include
#include
/****** 定义变量部分 ******/
int n;/***定义核心变量n ***/
int i,j,k=0;/***定义辅助变量***/
int a[200]={1},m;
/***定义并初始化数组a , 其中m=结果的位数除以4的余数***/
/****** 获取用户输入的数据 ******/
printf("please input a number (1~100)n: \n ");
scanf("%d",&n);
/****** 输入数据不合要求时的情况处理 ******/
if(n>100||n<1)
printf("Sorry!You enter a wrong number. \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;/***算出结果的位数除以4的余数***/
printf("the factorial of %d is:\n ",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("\n");
}/***** 按要求输出余数不为零时剩下的数 *****/
else
{
for(i=j;i>=0;i--)
{
printf("%d",a[i]);
k++;
if(k%4==0&&k!=j+1)
printf(",");
}
printf("\n");
}/***** 输出余数为零时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;
}
}
【将n阶乘后结果的个、十、百、千...位依次赋数给数组a[200]】
(四)核心算法流程图
(五)操作方法简介
点击“运行”后,根据提示(please input a number (1~100)n: )输入一个1~100中任一数(这一数值将赋予n),然后按回车键,即可得到所要求n阶乘的结果。
(六)实验结果
● 当输入数为1~100之间时
输入8
输入100
● 当输入数不合要求时
(七)设计体会
第四部分 附录
(一)程序中主要变量的功能说明
? n 核心变量,其值由用户输入(需在1~100之间)
? a[200] 用于存放n阶乘结果的个、十、百、千...位上的数
即a[0] =个位上的数,a[1] =十位上的数 ....
? m 结果的位数除以4以后的余数
? i,j,k 辅助变量,用于for循环等
(二)源程序代码
#include
#include
int main()
{
int n;//定义核心变量n
int i,j,k=0;//定义辅助变量
int a[200]={1},m;//定义变量并初始化数组a,其中m=结果的位数除以4的余数
printf("please input a number (1~100)n: \n ");
scanf("%d",&n);//获取用户输入的数据
if(n>100||n<1)
printf("Sorry!You enter a wrong number. \n");//输入数据不合要求时的处理
else
{
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;