当前位置:首页 > 数据结构与算法专题实验报告 - 图文
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 的元素时开始输出
共分享92篇相关文档