1、最大公约数三种办法计数器流程图 昆明理工大学信息工程与自动化学院学生实验报告 )1 学期 2013 学年 第 ( 2012 日10月 18 开课实验室: 2012 年课程名称:算法设计与分析442信自楼机房实验项目名称 N m% i =0 Y N n%i=0 i=i+1 Y Y r=0 N m=n n=r 求最大公约数 开始 开始 指导教师 吴晟教师评 语 该同学是否了解实验原理: A.了解 C.不了解 B.基本了解 A.强 C.差 该同学的实验能力:B.中等 未达到 该同学的实验是否达到要求:达到A. C. B.基本达到 C.不规范 实验报告是否规范: B.基本规范 A.规范 没有 C. 一
2、般详细A. 实验过程是否详细记录:B. 教师签名: 日 年 月输入m和n c=(mn?m:n)n m输入和r=m%n 一、上机目的及内容 1.上机内容 的最大公约数。n求两个自然数m和 上机目的2. )复习数据结构课程的相关知识,实现课程间的平滑过渡;(1 )掌握并应用算法的数学分析和后验分析方法;(2)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不3( 同,解题效率也不同。 二、实验原理及基本技术路线图(方框原理图或程序流程图) 1)至少设计出三个版本的求最大公约数算法;( 符号进行时间复杂性分析;2)对所设计的算法采用大O( 3)上机实现算法,并用计数法
3、和计时法分别测算算法的运行时间;( )通过分析对比,得出自己的结论。(4 -1- 连续整数检测算法流程图: k=i 输出 结束 时间复杂度T(n)=O(log2(n)) 连续整数检测算法 -2- 欧几里得算法流程图: n 输出 结束 :T(n)=O(n/2) 时间复杂度欧几里得算法 -3- 分解因式算法图 开始 输入 Y N a10,b10,s,t=2,i=0,all,i1,i2; m=m/t; ai=t,.i+ Y all=all*ai1 N t+ N Y s=n%t Y Y s=0 N N n 和m m=1| n=1 s=m%t s=0m=all n=n/t ;bi=t; i+; all=
4、1 for(i2=0;i2i;i2+) all=all*bi2; n=all Y all=1 /利用循环,求出公共质因数 for(int s1=0;s1i1;s1+) for(int s2=0;s2i2;s2+) if(as1=bs2) all=all*as1; -4- couallendl; 结束 分解因式时间复杂度 :T(n)= O(n/2) + O(log2(n) 三、所用仪器、材料(设备名称、型号、规格等或使用软件) 1台PC及VISUAL C+6.0软件 四、实验方法、步骤(或:程序代码或操作过程) #include stdio.h #include #include #includ
5、e #include int jishiqi_0(); int jishiqi_1(); int jishiqi_2(); int jishiqi_3(); float now,t0,t1,t2,t3; using namespace std; int m,n,c,k; /- int jishiqi_0()/输入时延长的多余时间 int i,j; for(i=1;i=10000;i+) for(j=1;j=20000;j+); t0=(clock()-now)/CLOCKS_PER_SEC; return 0; /- -5- int jishiqi_1()/分解因式算法所用时间 int i,j
6、; for(i=1;i=10000;i+) for(j=1;j=20000;j+); t1=(clock()-now)/CLOCKS_PER_SEC-t0; 牰湩晴尨分解因式算法所用时间为:%f msn,t1); return 0; /- int jishiqi_2()/欧几里得算法所用时间 int i,j; for(i=1;i=10000;i+) for(j=1;j=20000;j+); t3=(clock()-now)/CLOCKS_PER_SEC-t0-t1-t2; 牰湩晴尨欧几里得算法所用时间为:%f msn,t3); return 0; /- int jishiqi_3()/连续检测
7、算法所用时间 int i,j; for(i=1;i=10000;i+) for(j=1;jn?m:n); for(int i=1;i=c;i+) if(m%i=0&n%i=0) k=i; else continue; return k; /- int OJ(int m ,int n)/欧几里得算法 jishiqi_2(); int r; r=m%n; while(r!=0) m=n; n=r; r=m%n; return n; /- 分解质因数法int FJ(int m,int n)/ jishiqi_1(); if(m=1|n=1) 1endl; 潣瑵?最大公约数为: int a10,b10
8、,s,t=2,i=0,all,m1,n1,i1,i2; m1=m; n1=n; -7- coutm=; while(1) s=m1%t; /求m1除以t(t为2)的余数s if(s=0) /如果s为0,说明可以整除,则进行下面操作,记录t为质因数其中之一 m1=m1/t; ai=t; /把t摆在数组a中 coutt; i+; t=2; all=1; for(i1=0;i1i;i1+) all=all*ai1; if(m=all) break; /判断该整数的质因数是否全部求出 cout*; else t+; i=0; /把i重置为0,进行整数n的求质因数 coutendl; coutn=; w
9、hile(1) s=n1%t; if(s=0) n1=n1/t; bi=t; coutt; i+; t=2; all=1; for(i2=0;i2i;i2+) all=all*bi2; if(n=all) break; cout*; else t+; coutendl; all=1; for(int s1=0;s1i1;s1+) /利用循环,求出公共质因数 for(int s2=0;s2i2;s2+) if(as1=bs2) -8- all=all*as1; bs2=0; /已经配对的质因数被清0,避免出现重复性的错误! break; 潣瑵?最大公约数为: allendl; return 0;
10、 /- int main()/主函数 char c; while(1) cout=endl; cout 求最大公约数的程序endl; cout 1、分解质因数法 连续整数检测法 欧几里得算法 endl; cout=c; switch(c) case 1: 潣瑵?请分别输入两个整数mn; FJ(m,n); 潣瑵?最大公约数为:LX(m,n)endl; 潣瑵?最大公约数为:OJ(m,n)endl; break; default: 潣瑵?请重新输入!endl; break; return 0; -9- 五、实验过程原始记录( 测试数据、图表、计算等) 请给出各个操作步骤的截图和说明; -10- -1
11、1- 六:实验结果、分析和结论(误差分析与数据处理、成果总结等。其中,绘制曲线图时必须用计算纸或程序运行结果、改进、收获) 得出 : 我们从前面的时间复杂度 T(n) )log2(n)O(n/2) + O( O(n/2) Olog2(n) (欧几里得算法的是最优算法,其次是连续整除法,最复杂的是分解质因数算法。再从代码运行的计数器和计算的时间来看结果恰好和前面的复杂度得到的结果一致,所以得出结论-12- 欧几里得算法最优。 通过对三种计算最大公约数方法的比较解了算法设计的初步概念并对求公约数问题有了更深的认识。了解到了算法的优与劣的差别,虽然得到的是同样的结果,但是,需要的时间和资源却相差很大这提示我们在以后写算法的时候要找出最优算法。也告诉了我们算法对于一个程序的重要性,我们要对这门课产生足够的重视。 分解因式算法由于比较复杂,本人并不会,是从网上copy下来的。本程序在计时器上还有待改进。 注:教师必须按照上述各项内容严格要求,认真批改和评定学生成绩。 -13-
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1