昆明理工大学 算法 实验一 求最大公约数.docx

上传人:b****4 文档编号:5497103 上传时间:2023-05-08 格式:DOCX 页数:16 大小:73.25KB
下载 相关 举报
昆明理工大学 算法 实验一 求最大公约数.docx_第1页
第1页 / 共16页
昆明理工大学 算法 实验一 求最大公约数.docx_第2页
第2页 / 共16页
昆明理工大学 算法 实验一 求最大公约数.docx_第3页
第3页 / 共16页
昆明理工大学 算法 实验一 求最大公约数.docx_第4页
第4页 / 共16页
昆明理工大学 算法 实验一 求最大公约数.docx_第5页
第5页 / 共16页
昆明理工大学 算法 实验一 求最大公约数.docx_第6页
第6页 / 共16页
昆明理工大学 算法 实验一 求最大公约数.docx_第7页
第7页 / 共16页
昆明理工大学 算法 实验一 求最大公约数.docx_第8页
第8页 / 共16页
昆明理工大学 算法 实验一 求最大公约数.docx_第9页
第9页 / 共16页
昆明理工大学 算法 实验一 求最大公约数.docx_第10页
第10页 / 共16页
昆明理工大学 算法 实验一 求最大公约数.docx_第11页
第11页 / 共16页
昆明理工大学 算法 实验一 求最大公约数.docx_第12页
第12页 / 共16页
昆明理工大学 算法 实验一 求最大公约数.docx_第13页
第13页 / 共16页
昆明理工大学 算法 实验一 求最大公约数.docx_第14页
第14页 / 共16页
昆明理工大学 算法 实验一 求最大公约数.docx_第15页
第15页 / 共16页
昆明理工大学 算法 实验一 求最大公约数.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

昆明理工大学 算法 实验一 求最大公约数.docx

《昆明理工大学 算法 实验一 求最大公约数.docx》由会员分享,可在线阅读,更多相关《昆明理工大学 算法 实验一 求最大公约数.docx(16页珍藏版)》请在冰点文库上搜索。

昆明理工大学 算法 实验一 求最大公约数.docx

昆明理工大学算法实验一求最大公约数

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

(2011—2012学年第1学期)

课程名称:

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

信自楼机房4452011年10月12日

年级、专业、班

计科093

学号

200910405310

姓名

孙浩川

成绩

实验项目名称

求最大公约数

指导教师

张晶

教师评语

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

A.了解□B.基本了解□C.不了解□

该同学的实验能力:

A.强□B.中等□C.差□

该同学的实验是否达到要求:

A.达到□B.基本达到□C.未达到□

实验报告是否规范:

A.规范□B.基本规范□C.不规范□

实验过程是否详细记录:

A.详细□B.一般□C.没有□

教师签名:

年月日

一、上机目的及内容

上机内容

求两个自然数m和n的最大公约数。

上机目的

(1)复习数据结构课程的相关知识,实现课程间的平滑过渡;

(2)掌握并应用算法的数学分析和后验分析方法;

(3)理解这样一个观点:

不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。

二、实验原理及基本技术路线图(方框原理图或程序流程图)

(1)至少设计出三个版本的求最大公约数算法;

(2)对所设计的算法采用大O符号进行时间复杂性分析;

(3)上机实现算法,并用计数法和计时法分别测算算法的运行时间;

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

 

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

1台PC及VISUALC++6.0软件

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

程序代码或操作过程)

1.连续整数检测

#include

//连续整数检测

intgcd(intm,intn)

{

intt=m>n?

n:

m;

while(true)

{

if(m%t==0)

{

if(n%t==0)

{

returnt;

}

elset--;

}

elset--;

}

}

voidmain()

{

intm,n;

cout<<"Inputmandn:

"<

while(cin>>m>>n)

{

cout<<"Output:

"<

cout<

}

}

2.欧几里得算法

#include

//欧几里德算法

intgcd(intm,intn)

{

intr;

while(n!

=0)

{

r=m%n;

m=n;

n=r;

}

returnm;

}

voidmain()

{

intm,n;

cout<<"Inputmandn:

"<

while(cin>>m>>n)

{

cout<<"Output:

"<

cout<

}

}

3.分解质因数

#include

//分解质因数法

intFJ(intm,intn)

{

if(m==1||n==1)

{

cout<<"最大公约数为:

1"<

}

inta[10],b[10],s,t=2,i=0,all,m1,n1,i1,i2;

m1=m;

n1=n;

cout<

while

(1)

{

s=m1%t;//求m1除以t(t为2)的余数s

if(s==0)

{

m1=m1/t;

a[i]=t;//把t摆在数组a[]中

cout<

i++;

t=2;

all=1;

for(i1=0;i1

{

all=all*a[i1];

}

if(m==all)break;//判断该整数的质因数是否全部求出

cout<<"*";

}

elset++;

}

i=0;//把i重置为0,进行整数n的求质因数

cout<

cout<

while

(1)

{

s=n1%t;

if(s==0)

{

n1=n1/t;

b[i]=t;

cout<

i++;

t=2;

all=1;

for(i2=0;i2

{

all=all*b[i2];

}

if(n==all)break;

cout<<"*";

}

elset++;

}

cout<

all=1;

for(ints1=0;s1

{//利用循环,求出公共质因数

for(ints2=0;s2

{

if(a[s1]==b[s2])

{

all=all*a[s1];

b[s2]=0;

break;

}

}

}

cout<<"最大公约数为:

"<

return0;

}

voidmain()

{

intm,n;

charc;

cout<<"请分别输入两个整数"<

cin>>m>>n;

FJ(m,n);

}

3.计数法和计时法分别测算算法的运行时间

#include

#include"iostream.h"

#include"stdio.h"

#include"stdlib.h"

#include"time.h"

#defineN100

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

intf1(intm,intn)//连续整数检测

{

intt=m>n?

n:

m;

while(true)

{

if(m%t==0)

{

if(n%t==0)

{

returnt;

}

elset--;

w1++;

}

elset--;w1++;

}

}

 

intf2(intm,intn)//欧几里德算法

{

intr;

while(n!

=0)

{

r=m%n;

m=n;

n=r;

w2++;

}

returnm;

}

 

intf3(intm,intn)//分解质因数法

{

if(m==1||n==1)

{

cout<<"最大公约数为:

1";

}

inta[10],b[10],s,t=2,i=0,all,m1,n1,i1,i2;

m1=m;

n1=n;

//cout<

while

(1)

{

s=m1%t;//求m1除以t(t为2)的余数s

if(s==0)

{

m1=m1/t;

a[i]=t;//把t摆在数组a[]中

//cout<

i++;

t=2;

all=1;

w3++;

for(i1=0;i1

{

all=all*a[i1];

}

if(m==all)break;//判断该整数的质因数是否全部求出

//cout<<"*";

}

elset++;w3++;

}

i=0;//把i重置为0,进行整数n的求质因数

//cout<

//cout<

while

(1)

{

s=n1%t;

if(s==0)

{

n1=n1/t;

b[i]=t;

//cout<

i++;

t=2;

all=1;w3++;

for(i2=0;i2

{

all=all*b[i2];

}

if(n==all)break;

//cout<<"*";

}

elset++;w3++;

}

//cout<

all=1;

for(ints1=0;s1

{//利用循环,求出公共质因数

for(ints2=0;s2

{

if(a[s1]==b[s2])

{

all=all*a[s1];

b[s2]=0;w3++;

break;

}

}

}

//cout<<"最大公约数为:

"<

returnall;

}

voidmain()

{

intm,n;

cout<<"Inputmandn:

"<

cin>>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\n\n");

printf("方法一:

%d\n",w1);

printf("方法二:

%d\n",w2);

printf("方法三:

%d\n",w3);

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

floata,i;

clock_tstart,finish;

doubleusetime;

i=0;

start=clock();

while(i<100000)

{

f1(m,n);

i++;

}

finish=clock();

usetime=finish-start;

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

i=0;

start=clock();

while(i<100000)

{

f2(m,n);

i++;

}

finish=clock();

usetime=finish-start;

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

i=0;

start=clock();

while(i<100000)

{

f3(m,n);

i++;

}

finish=clock();

usetime=finish-start;

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

}

 

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

1.连续整数检测

2.欧几里得算法

3.分解质因数

4.计数法和计时法分别测算算法的运行时间

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

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

第一种,连续整数检测法。

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

第二种,欧几里得算法。

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

第三种,分解质因数法。

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

结果分析:

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

欧几里得算法最优。

通过对三种计算最大公约数方法的比较,了解了算法设计的初步概念,并对求公约数问题有了更深的认识。

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

也告诉了我们,算法对于一个程序的重要性,我们要对这门课产生足够的重视。

注:

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

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

当前位置:首页 > 小学教育 > 语文

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

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