数据结构与算法专题实验报告 - 图文

发布时间 : 星期一 文章数据结构与算法专题实验报告 - 图文更新完毕开始阅读

for(j=n+2;j

fprintf(fpt,\ }

fclose(fpt); }

返回

第2题 大数阶乘

1 题目:

求N!(N>10)

2 目标:

1. 掌握大数的处理方法

2. 编程实现时应该考虑边界条件的处理。

3 设计思想:

1. 为实现大数阶乘,我们来看下面的分析:

0!=1;1!=1; 2!=1+1;(1!加2次) 3!=2+2+2;(2!加3次) 4!=6+6+6+6;(3!加4次)

n!=(n-1)!+(n-1)!+(n-1)!+??+(n-1)!+(n-1)!( (n-1)!加n次)

算n!要先算(n-1)!,然后再把它相加n次,可以用类似竖式加法实现。

a[MAX]??a[3] a[2] a[1] a[0] + a[MAX]??b[3] b[2] b[1] b[0]

a[MAX]??a[3] a[2] a[1] a[0]

2. 还要考虑边界条件,负数无法求阶乘,太大的数求阶乘太耗时间,故确定范围[0,NUM],在此范围内程序继续执行,超出这个范围,则返回重新输入。

3. 对一个数来说最高位不可能为0,设置从a[MAXnumber]开始扫

描,遇到第一个不为0的数位时开始输出。

4 算法描述:

step1:定义数组的最大位数,定义存放最后结果和分布结果的

数组a和b;

step2: 输入并判断,符合,则继续,不符合,返回重新输入; step3: while(0

a.初始化两个数组,a[0]=1,,输入所要求阶乘的那个数n; b.for语句(j

step4:输出 ,从a数组的最后一个元素向前扫描,遇到第一个不

为0的数字开始输出。

5 程序流程图:

6 源程序:

#include

#define MAXnumber 3000 //定义数组的最大长度 void main( )

{ int a[MAXnumber],b[MAXnumber]; //定义存放结果的数组 int i,j,m,k,r,n;

char ch='y'; while(ch!='n')

{ cout<<\请输入你所想求阶乘的那个数:\ cin>>n;

if(n>1000) //设置大数的边界条件,大数求阶乘比

较慢

{

cout<<\你所输入的数字太大,请重新输入!\

cin>>n;

}

while(n<0) //设置边界条件,负数无法求阶乘

{ cout<<\对不起,输入错误,请重新输入!\

cin>>n; }

for(i=1;i

{ for(i=0;i

b[i]=a[i]; for(m=1;m

for(i=0;i

{ r=a[i]+b[i];

if(r>9) a[i+1]++; a[i]=r;

} }

k=MAXnumber-1; // 从数组末一个元素开始扫描,当遇到第一个不为0 的元素时开始输出

联系合同范文客服:xxxxx#qq.com(#替换为@)