-1-昆明理工大学信息工程与自动化学院学生实验报告(201—201学年第1学期)课程名称:算法设计与分析开课实验室:年月日年级、专业、班学号姓名成绩实验项目名称求最大公约数指导教师教师评语该同学是否了解实验原理:A.了解□B.基本了解□C.不了解□该同学的实验能力:A.强□B.中等□C.差□该同学的实验是否达到要求:A.达到□B.基本达到□C.未达到□实验报告是否规范:A.规范□B.基本规范□C.不规范□实验过程是否详细记录:A.详细□B.一般□C.没有□教师签名:年月日一、上机目的及内容1.上机内容求两个自然数m和n的最大公约数。2.上机目的(1)复习数据结构课程的相关知识,实现课程间的平滑过渡;(2)掌握并应用算法的数学分析和后验分析方法;(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。二、实验原理及基本技术路线图(方框原理图或程序流程图)(1)至少设计出三个版本的求最大公约数算法;(2)对所设计的算法采用大O符号进行时间复杂性分析;(3)上机实现算法,并用计数法和计时法分别测算算法的运行时间;-2-(4)通过分析对比,得出自己的结论。本次实验求最大公约数设计了三种算法,方法一时间复杂度为:O(n/2);方法二时间复杂度为:O(logn);方法三时间复杂度为:O(n)。三种算法的结果是一样的,但执行时间不相同。使用MicrosoftOfficeVisio画出三种算法的流程图如下:方法一:开始输入m,nt-min(m,n)x=m%t结束x=0t=t-1y=n%ty=0returntYYNN-3-方法二:开始结束输入m,n输出nr=0r-m%nm-n,n=tNY方法三:开始结束输入m,ni-2r-m%ii-i+1r为质因数存入数组r=0i-aNYYN-4-三、所用仪器、材料(设备名称、型号、规格等或使用软件)1台PC及VISUALC++6.0软件四、实验方法、步骤(或:程序代码或操作过程)方法一:程序代码:#includestdio.hintmin(intm,intn){if(mn)returnm;elsereturnn;}voidmain(){intm,n,t;printf(method(1)\n);printf(请输入两个数:\n);scanf(%d,%d,&m,&n);t=min(m,n);for(;t0;t--){if(m%t==0&&n%t==0){printf(%d和%d的最大公约数为%d:\n,m,n,t);break;}}}方法二:程序代码:#includestdio.hvoidmain(){intm,n,r;inta,b,temp;printf(method(2)\n);-5-printf(请输入两个数:\n);scanf(%d,%d,&m,&n);if(mn){temp=m;m=n;n=temp;}a=m;b=n;r=m%n;while(r!=0){m=n;n=r;r=m%n;}printf(%d和%d的最大公约数为%d:\n,a,b,n);}方法三:程序代码:#includestdio.h#defineN10inta[N],b[N];voiddivide(intt,intr[]){inti,j=0;for(i=2;i=t;i++){if(t%i==0){t=t/i;r[j]=i;j=j+1;i=i-1;}}}voidmain(){intm,n,i,j,k=0,p,c[N];for(i=0;iN;i++){-6-a[i]=0;b[i]=0;c[i]=0;}printf(method(3)\n);printf(请输入两个数:\n);scanf(%d,%d,&m,&n);divide(m,a);divide(n,b);for(i=0;i=N;i++){for(j=0;j=N;j++){if(a[i]==b[j]){c[k]=b[j];b[j]=0;k=k+1;break;}}}for(i=0,p=1;iN;i++){if(c[i]!=0)p=p*c[i];}printf(%d和%d的最大公约数是:%d\n,m,n,p);}五、实验过程原始记录(测试数据、图表、计算等)在三种方法中分别输入两个数求出最大公约数,以下为三种方法运行截图:六、实验结果、分析和结论(误差分析与数据处理、成果总结等。其中,绘制曲线图时必须用计算纸或程序运行结果、改进、收获)这次实验设计了三种方法来求解最大公约数,虽然三种算法的最终结果是相同的,但是它们的时间复杂度以及运行时间不相同。方法一时间复杂度为:O(n/2);方法二时间复杂度为:O(logn);方法三时间复杂度为:O(n)。通过这-7-次实验,我们还对数据结构的一些知识进行了复习,对算法的时间复杂度更加熟悉,以及知道了算法的设计方法和思路的不同对算法本身的执行会有一定的影响。