1.算法-最大公约数的三种算法
昆明理工大学信息工程与自动化学院学生实验报告
( 2011 —2012 学年 第 1 学期 )
课程名称:算法设计与分析 开课实验室:信自楼机房444 2011 年10月 12日
一、上机目的及内容
1. 上机内容
求两个自然数m 和n 的最大公约数。 2. 上机目的
(1)复习数据结构课程的相关知识,实现课程间的平滑过渡; (2)掌握并应用算法的数学分析和后验分析方法;
(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。
二、实验原理及基本技术路线图(方框原理图或程序流程图)
(1)至少设计出三个版本的求最大公约数算法;
(2)对所设计的算法采用大O 符号进行时间复杂性分析;
(3)上机实现算法,并用计数法和计时法分别测算算法的运行时间; (4)通过分析对比,得出自己的结论。
三、所用仪器、材料(设备名称、型号、规格等或使用软件)
1台PC 及VISUAL C++6.0软件
四、实验方法、步骤(或:程序代码或操作过程)
实验采用三种方法求最大公约数
源代码
#include #include #include #include #include
int xiangchu(int m,int n); int xiangjian(int m,int n); int qiongju(int m,int n); int duanchu(int m,int n); void main() {
printf("相除法求最大公约数:%d\n",xiangchu(m,n)); double t1,t2,t3,t4,t5,t6; int m,n; int i=0;
double usetime1,usetime2,usetime3; time_t start, end; printf("请输入两个数:"); scanf("%d%d",&m,&n);
t1=clock();
while(i
{
xiangchu(m,n);
i++; }
t2=clock();
usetime1 = t2-t1;
printf("It takes %.f*10^(-6)\n",usetime1);
printf("相减法求最大公约数:%d\n",xiangjian(m,n));
t3=clock();
while(i
xiangchu(m,n);
i++; }
t4=clock();
usetime2 = t4-t3;
printf("It takes %.f*10^(-6)\n",usetime2);
printf("短除法求最大公约数:%d\n",duanchu(m,n));
t5=clock();
while(i
xiangchu(m,n);
i++; }
t6=clock();
usetime3 = t6-t5;
printf("It takes %.f*10^(-6)\n",usetime3); }
int xiangchu(int m,int n) {//辗转相除法
int c; }
int xiangjian(int m,int n)//相减法 {
c=m%n; while(c!=0) { } return n;
m=n; n=c; c=m%n;
while(m!=n) {
if(m>n)
}
}
else
n-=m; m-=n;
return n;
int duanchu(int m,int n)//短除法 {
int i,factor=1;
for(i=2;i
return factor;
while (m%i==0 && n%i==0) { }
factor=factor*i; m=m/i; n=n/i;
}
五、实验过程原始记录( 测试数据、图表、计算等)
六、实验结果、分析和结论(误差分析与数据处理、成果总结等。其中,绘制曲线图时必须用计算纸或程序运行结果、改进、收获)
该次实验让我知道了求最大公约的不同种算法,除了以上三种,还有分解质因法和连续整数检测法, 也让我学习到了更多的内容,但是唯一不足的地方就是算时间复杂度和空间复杂度我还是不怎么熟悉,还是要多加联系才能提高。
注:教师必须按照上述各项内容严格要求,认真批改和评定学生成绩。