最大公约数的三种算法复杂度分析时间计算.docx

上传人:b****6 文档编号:15388435 上传时间:2023-07-04 格式:DOCX 页数:15 大小:37.21KB
下载 相关 举报
最大公约数的三种算法复杂度分析时间计算.docx_第1页
第1页 / 共15页
最大公约数的三种算法复杂度分析时间计算.docx_第2页
第2页 / 共15页
最大公约数的三种算法复杂度分析时间计算.docx_第3页
第3页 / 共15页
最大公约数的三种算法复杂度分析时间计算.docx_第4页
第4页 / 共15页
最大公约数的三种算法复杂度分析时间计算.docx_第5页
第5页 / 共15页
最大公约数的三种算法复杂度分析时间计算.docx_第6页
第6页 / 共15页
最大公约数的三种算法复杂度分析时间计算.docx_第7页
第7页 / 共15页
最大公约数的三种算法复杂度分析时间计算.docx_第8页
第8页 / 共15页
最大公约数的三种算法复杂度分析时间计算.docx_第9页
第9页 / 共15页
最大公约数的三种算法复杂度分析时间计算.docx_第10页
第10页 / 共15页
最大公约数的三种算法复杂度分析时间计算.docx_第11页
第11页 / 共15页
最大公约数的三种算法复杂度分析时间计算.docx_第12页
第12页 / 共15页
最大公约数的三种算法复杂度分析时间计算.docx_第13页
第13页 / 共15页
最大公约数的三种算法复杂度分析时间计算.docx_第14页
第14页 / 共15页
最大公约数的三种算法复杂度分析时间计算.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

最大公约数的三种算法复杂度分析时间计算.docx

《最大公约数的三种算法复杂度分析时间计算.docx》由会员分享,可在线阅读,更多相关《最大公约数的三种算法复杂度分析时间计算.docx(15页珍藏版)》请在冰点文库上搜索。

最大公约数的三种算法复杂度分析时间计算.docx

最大公约数的三种算法复杂度分析时间计算

理工大学信息工程与自动化学院学生实验报告

(2011—2012学年第1学期)

课程名称:

算法设计与分析开课实验室:

信自楼机房4442011年10月12日

年级、专业、班

计科092

学号

4

徐兴繁

成绩

实验项目名称

求最大公约数

指导教师

吴晟

教师评语

该同学是否了解实验原理:

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)上机实现算法,并用计数法和计时法分别测算算法的运行时间;

(4)通过分析对比,得出自己的结论。

 

三、所用仪器、材料(设备名称、型号、规格等或使用软件)

1台PC及VISUALC++6.0软件

四、实验方法、步骤(或:

程序代码或操作过程)

实验采用三种方法求最大公约数

 

1、连续整数检测法。

2、欧几里得算法

3、分解质因数算法

根据实现提示写代码并分析代码的时间复杂度:

方法一:

intf1(intm,intn)

{

intt;

if(m>n)t=n;

elset=m;

while(t)

{

if(m%t==0&&n%t==0)break;

elset=t-1;

}

returnt;

}

根据代码考虑最坏情况他们的最大公约数是1,循环做了t-1次,最好情况是只做了1次,可以得出O(n)=n/2;

方法二:

intf2(intm,intn)

{

intr;

r=m%n;

while(r!

=0)

{

m=n;

n=r;

r=m%n;

}

returnn;

}

根据代码辗转相除得到欧几里得的O(n)=logn

方法三:

intf3(intm,intn)

{

inti=2,j=0,h=0;

inta[N],b[N],c[N];

while(i

{

if(n%i==0)

{

j++;

a[j]=i;

n=n/i;

}

elsei++;

}

j++;

a[j]=n;

i=1;

intu;

u=j;

while(i<=j)

{

//printf("%d",a[i]);

i++;

}

i=2;

j=0;

while(i

{

if(m%i==0)

{

j++;

b[j]=i;

m=m/i;

}

elsei++;

}

j++;

b[j]=m;

i=1;

while(i<=j)

{

//printf("%d",b[i]);

i++;

}

intk=1;

for(i=1;i<=j;i++)

{

for(k=1;k<=u;k++)

{

if(b[i]==a[k])

{

h++;

c[h]=a[k];//printf("%d",c[h]);

a[k]=a[k+1];

break;

}

}

}

k=1;

while(h>1)

{

k=k*c[h]*c[h-1];

h=h-2;

}

if(h==1)

{

k=k*c[1];

returnk;

}

elsereturnk;

}

根据代码分解质因子算法O(n)=n2+n/2

为了计算每种算法运行的次数所用的时间,我将代码稍加改动添加代码如下:

其中计数器采用的是没做一次循环就加1;

计时器是记住开始时间和结束时间,用结束时间减开始时间。

#include"iostream.h"

#include"stdio.h"

#include"stdlib.h"

#include"time.h"

#defineN100

intw,w2,w3;//用于计数

intf1(intm,intn)

{

intt;

if(m>n)t=n;

elset=m;

while(t)

{

if(m%t==0&&n%t==0)break;

elset=t-1;

w++;

}

returnt;

}

intf2(intm,intn)

{

intr;

r=m%n;w2=1;

while(r!

=0)

{

m=n;

n=r;

r=m%n;

w2++;

}

returnn;

}

intf3(intm,intn)

{

inti=2,j=0,h=0;

inta[N],b[N],c[N];

while(i

{

if(n%i==0)

{

j++;

a[j]=i;

n=n/i;

w3++;

}

else

{

i++;

w3++;

}

}

j++;

a[j]=n;

i=1;

intu;

u=j;

while(i<=j)

{

//printf("%d",a[i]);

i++;

w3++;

}

//printf("\n");

i=2;

j=0;

while(i

{

if(m%i==0)

{

j++;

b[j]=i;

m=m/i;

w3++;

}

else

{

i++;

w3++;

}

}

j++;

b[j]=m;

i=1;

while(i<=j)

{

//printf("%d",b[i]);

i++;

w3++;

}

intk=1;

for(i=1;i<=j;i++)

{

for(k=1;k<=u;k++)

{

if(b[i]==a[k])

{

w3++;

h++;

c[h]=a[k];//printf("\n%d",c[h]);

a[k]=a[k+1];

break;

}

}

}

k=1;

while(h>1)

{

k=k*c[h]*c[h-1];

h=h-2;

w3++;

}

if(h==1)

{

k=k*c[1];

returnk;

}

elsereturnk;

}

intmain(void)

{

intm,n;

printf("请输入m,n:

\n");

scanf("%d%d",&m,&n);

intk;

k=f1(m,n);

printf("方法一最大公约数为:

%d\n",k);

k=f2(m,n);

printf("方法二最大公约数为:

%d\n",k);

k=f3(m,n);

printf("方法三最大公约数为:

%d\n",k);

printf("\n--------------------\n");

printf("\n计数器显示结果:

\n\n\n");

printf("方法一:

%d\n",w2);

printf("方法二:

%d\n",w);

printf("方法三:

%d\n",w3);

printf("\n--------------------\n");

floata,i;

clock_tstart,finish;

doubleusetime;

i=0;

start=clock();

while(i<1000000)

{

f1(m,n);

i++;

}

finish=clock();

usetime=finish-start;

printf("方法一用时%.f*10^(-6)豪秒\n",usetime);

i=0;

start=clock();

while(i<1000000)

{

f2(m,n);

i++;

}

finish=clock();

usetime=finish-start;

printf("方法二用时%.f*10^(-6)豪秒\n",usetime);

i=0;

start=clock();

while(i<1000000)

{

f3(m,n);

i++;

}

finish=clock();

usetime=finish-start;

printf("方法三用时%.f*10^(-6)豪秒\n",usetime);

}

五、实验过程原始记录(测试数据、图表、计算等)

请给出各个操作步骤的截图和说明;

三种算法得到结果验证结果:

 

计数器:

我想到的是做一次循环就加一

计算算法运行时间结果:

在计算时间过程中因为计算机的运算速度很快,所以我利用了循环把时间精确得到10-6毫秒

 

六、实验结果、分析和结论(误差分析与数据处理、成果总结等。

其中,绘制曲线图时必须用计算纸或程序运行结果、改进、收获)

请结合实验的结果分析算法原理;在实验中遇到了些什么问题,如何解决;有什么收获等;

在本次实验中代码是独自完成的,一开始我感觉这个代码最多半小时就可以完成,但是第三个算法的时候我分析了好久才写出来,在计算三种方法运行时间的时候,我一开始只精确到毫秒(ms),计算结果都是零,后面我写了一个循环调试才发现是我的精确度还在不够,所以我想到了计算算法执行了1000000次之后所用的时间,然后再求平均每次执行的时间。

结果分析:

从前面的复杂度O(n)的出欧几里得算法的是最优算法,连续整除法其次,最复杂的是分解质因数算法,再从代码运行的计数器和计算的时间来看结果恰好和前面的复杂度得到的结果一致,所以的出结论:

欧几里得算法最优。

从这次实验的结果我了解到了算法的优与劣的差别,虽然得到的是同样的结果,但是需要的时间和资源却相差很大,这提示我们在以后写算法的时候要找出最优算法。

可见算法分析与设计课程的对计编程的人来说是多么的重要,在以后写程序过程中要时刻提醒自己找最优算法,当然得先学会O(n)的分析。

 

注:

教师必须按照上述各项容严格要求,认真批改和评定学生成绩。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2