算法分析求最大公约数-软件工程-13083511-周成

2019-03-22 19:42

北京联合大学硕士研究生

算法设计与分析实验报告

实 验 项 目: 求最大公约数 姓 名: 周 成 学 号: 13083511 指 导 教 师: 王育坚 编 制 日 期: 2014-03-11

-1-

1 实验项目

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

2 实验目的

(1)复习数据结构课程的相关知识,实现课程间的平滑过渡; (2)掌握并应用算法的数学分析和后验分析方法;

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

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

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

(3)上机实现算法,并用计数法和计时法分别测算算法的运行时间; (4)通过分析对比,得出自己的结论。

4 算法设计与实现

(1)实验环境:Microsoft Visual Studio2010

1、连续整数检测法。 2、欧几里得算法 3、分解质因数算法

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

int f1(int m,int n) { int t; if(m>n)t=n; else t=m; while(t) { if(m%t==0&&n%t==0)break; else t=t-1; } return t; }

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

O(n)=n/2;

方法二:int f2(int m,int n) { int r; r=m%n; while(r!=0) { m=n; n=r; r=m%n; }

-2-

}

return n;

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

方法三:

int f3(int m,int n) { int i=2,j=0,h=0; int a[N],b[N],c[N]; while(i

while(i

-3-

}

{

//printf(\ i++; }

int k=1;

for(i=1;i<=j;i++) { for(k=1;k<=u;k++) { if(b[i]==a[k]) { h++; c[h]=a[k];//printf(\ 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]; return k; }

else return k;

2

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

+n/2

为了计算每种算法运行的次数所用的时间,我将代码稍加改动添加代码如下: 其中计数器采用的是没做一次循环就加1;

计时器是记住开始时间和结束时间,用结束时间减开始时间。 #include\#include\#include\#include\#define N 100

-4-

int w,w2,w3;//用于计数 int f1(int m,int n) { int t;

if(m>n)t=n; else t=m; while(t) { if(m%t==0&&n%t==0)break; else t=t-1; w++;

} return t;

}

int f2(int m,int n) { int r; r=m%n;w2=1; while(r!=0) {

m=n;

n=r; r=m%n; w2++;

}

return n;

-5-


算法分析求最大公约数-软件工程-13083511-周成.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:七牌二图

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: