三种方法求最大公约数200910405429
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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倍所得----------");