三种方法求最大公约数200910405429

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

(2011 —2012 学年第 1 学期)

课程名称:算法设计与分析开课实验室:信自楼应用、网络机房445 2011 年10月 19日年级、专业、班计科094 学号200910405429 姓名徐章林成绩

实验项目名称求最大公约数指导教师吴霖

教师评语该同学是否了解实验原理: A.了解□ B.基本了解□ C.不了解□

该同学的实验能力: A.强□ B.中等□ C.差□

该同学的实验是否达到要求: A.达到□ B.基本达到□ C.未达到□

实验报告是否规范: A.规范□ B.基本规范□ C.不规范□

实验过程是否详细记录: A.详细□ B.一般□ C.没有□

教师签名:

年月日

一、上机目的及内容

1.上机内容

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

2.上机目的

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

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

(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。

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

1台PC及VISUAL C++6.0软件

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

(1)分解质因数法的流程分析如下图:

(2)连续整数检测法流程分析如下图:

(3)殴几里德流程分析如下图:

四、实验方法、步骤(或:程序代码或操作过程)

/*--------------------用多种方法计算两个数的最大公约数----------------------*/ /*-----------------作者:200910405429--------开发环境:DEV C++----------------*/ #include "stdio.h"

#include "conio.h"

#include"time.h"

/*------------------------以下是分解质因数法--------------------------------*/ int gcd_factor(int a,int b)

{

int k=1,i,temp;

{

temp=a;

a=b;

b=temp;

}

if(a%b==0)

{

return b;

}

else

{

for(i=2;i

{

while(a%i==0&&b%i==0)

{

k=k*i;

a=a/i;/*要除以已经选出来的质因数,以免重复计算*/ b=b/i;

}

}

return k;

}

}

/*-----------------------------以下是更相减损术-----------------------------*/ int gcd_reduction(int a,int b)

{

int temp;

if(a

{

temp=a;

a=b;

b=temp;

}

if(a==b)

return a;

else

return gcd_reduction(b,a-b);

}

/*-----------------------------连续整数检测法-------------------------------*/ int gcd_continuous(int a ,int b)/**/

{

int i,k,temp;

temp=a

for(i=0;i

{

k=temp-i;

if(((a%k)==0)&&((b%k)==0))

{

return k;

break;

}

}

getch();

}

/*------------------------------欧几里德算法--------------------------------*/ int gcd_Euclidean (int a,int b)

{

if (!b)

return a;

else

return gcd_Euclidean (b,a%b);

}

/*---------------------------------主函数-----------------------------------*/ main()

{

int a, b,i=1000;

double start=0,end=0,time[4];

printf("输入两个整数:");

scanf ("%d %d",&a,&b);

while(1)

{

start=clock(); /*以下测算gcd_factor(a,b)的时间*/

while(i>0)

{

gcd_factor(a,b);

i--;

}

end=clock();

time[0]=(end-start);

end=0;

start=clock(); /*以下测算gcd_Euclidean(a,b)的时间*/

while(i>0)

{

gcd_Euclidean(a,b);

i--;

}

end=clock();

time[1]=(end-start);

start=clock(); /*以下测算gcd_continuous(a,b)的时间*/

while(i>0)

{

gcd_continuous(a,b);

i--;

}

end=clock();

time[2]=(end-start);

start=clock(); /*以下测算gcd_reduction(a,b)的时间*/

while(i>0)

{

gcd_reduction(a,b);

i--;

}

end=clock();

time[3]=(end-start);

break;

}

printf("\n\n");

printf("\n\t------几种求最小公约数的算法-----\n");

printf("\n\t*----------------------------------------------*"); printf("\n\t-- 1-----分解质因数法:%d 运行时

间:%lf----",gcd_factor(a,b),time[0]);

printf("\n\t-- 2-----殴几里德:%d 运行时

间:%lf----",gcd_Euclidean(a,b),time[1]);

printf("\n\t-- 3-----连续整数检测:%d 运行时

间:%lf----",gcd_continuous(a,b),time[2]);

printf("\n\t-- 4-----更相减损算术:%d 运行时

间:%lf----",gcd_reduction(a,b),time[3]);

printf("\n\t--- 注:以上运行时间为延迟1000倍所得----------");

相关文档
最新文档