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

合集下载

求最大公约数的几种算法

求最大公约数的几种算法

求最⼤公约数的⼏种算法 给定两个整数,求出这两个整数的最⼤公约数是我们从⼩就接触过的问题,但是我们如何⽤更简洁的算法来计算呢? 本⽂中,假定这两个整数是m和n且m>=n>=0。

让我们从最简单的算法说起!⼀、Consecutive Integer Test——连续整数检测算法 由最⼤公约数的概念,我们可以知道,能够同时被两个给定整数整除的最⼤整数,即是最⼤公约数。

那么我们可以最简单的想出⽤暴⼒搜索的⽅法,从两个整数中较⼩的那⼀个开始,向下穷举遍历,找到最⼤公约数。

当然,这种⽅法是低效的,存在着很⼤的不确定性。

Step1:将min{m,n}的值赋给t。

Step2:判断t是否为0,如果是0,返回max{m,n};否则,进⼊第三步。

Step3:m除以t,如果余数为0,则进⼊第四步;否则进⼊第五步。

Step4:n除以t,如果余数为0,则返回t值作为结果;否则进⼊第五步。

Step5:把t的值减1,返回第三步。

1int consecutiveIntegerTest(int m, int n) {2int t = n;3while (t != 0) {4if (m % t == 0) {5if (n % t == 0)6return t;7else8 --t;9 } else10 --t;11 }12return m;13 } 最终的返回值m,即为m和n的最⼤公约数。

⼆、Euclidean(recursion)——欧⼏⾥得算法 求取最⼤公约数最经典的算法莫过于欧⼏⾥得算法了,既是所谓的辗转相除法,⽐起暴利搜索更加⾼效稳定。

欧⼏⾥得算法有递归和⾮递归两种表达⽅式。

(递归⽅式)1int Euclidean_Recursion(int m, int n) {2if (n == 0)3return m;4return method1(n, m % n);5 } (⾮递归⽅式)1int Euclidean_nonRecursion(int m, int n) {2while (n != 0) {3int r = m % n;4 m = n;5 n = r;6 }7return m;8 } 以上就是求出m,n最⼤公约数的三种算法,希望⼤家互相学习。

matlab最大公约数 三种算法

matlab最大公约数 三种算法

算法设计与分析11信本余启盛 118632011004一、上机目的及内容1.上机内容求两个自然数m和n的最大公约数。

2.上机目的(1)复习数据结构课程的相关知识,实现课程间的平滑过渡;(2)掌握并应用算法的数学分析和后验分析方法;(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。

二、实验原理及基本技术路线图(1)至少设计出三个版本的求最大公约数算法;(2)对所设计的算法采用大O符号进行时间复杂性分析;(3)上机实现算法,并用计数法和计时法分别测算算法的运行时间;(4)通过分析对比,得出自己的结论。

三、所用仪器、材料(设备名称、型号、规格等或使用软件)1台PC及VISUAL C++6.0软件matlab .2008四、实验方法、步骤(或:程序代码或操作过程)实验采用三种方法求最大公约数1、连续整数检测法。

2、欧几里得算法3、蛮力法(短除法)根据实现提示写代码并分析代码的时间复杂度:算法一:连续整数检测法。

CommFactor1输入:两个自然数m和n输出:m和n的最大公约数1.判断m和n哪个数小,t=min(m,n)2.如果m%t==0&&n%t==0 ,结束2.1 如果t不是m和n的公因子,则t=t-1;3. 输出t ;根据代码考虑最坏情况他们的最大公约数是1,循环做了t-1次,最好情况是只做了1次,可以得出O(n)=n/2;算法二:欧几里德算法CommFactor2输入:两个自然数m和n输出:m和n的最大公约数1. r = m % n;2. 循环直到r 等于02.1 m = n;2.2 n = r;2.3 r = m % n;3. 输出n ;根据代码辗转相除得到欧几里得的: O(n)= log n算法三:蛮力法(短除法)CommFactor3输入:两个自然数m和n输出:m和n的最大公约数1.factor=1;2.循环变量i从2-min(m,n),执行下述操作:2.1 如果i是m和n的公因子,则执行下述操作:2.1.1 factor=factor*i;2.1.2 m = m / i; n = n / i;2.2 如果i不是m和n的公因子,则i=i+1;3. 输出factor;根据代码考虑最坏情况他们的最大公约数,循环做了i-1次;最好情况是只做了1次,可以得出: O(n)=n/2;MATLAB程序代码:main.mx=fix(rand(1,1000)*1000);y=fix(rand(1,1000)*1000);for i=1:1000A(i)=CommFactor2(x(i),y(i));endx=x';y=y';算法一:function r=CommFactor1(m,n)tic;if m>n)t=n;else t=m;while(t)if(m%t==0&&n%t==0)break;else t=t-1;endendr=ttoc;算法二:function r=CommFactor2(m,n)tic;r=mod(m,n);while r~=0m=n;n=r;r=mod(m,n);endr=n;toc;算法三:function factor=CommFactor3(m,n)tic;factor=1;themax=max(m,n);for i=2:1:themaxwhile (mod(m,i)==0)&&(mod(n,i)==0) factor=factor*i;m=m/i;n=n/i;endendtoc;三种算法时间复杂度比较:(c++语言)#include"iostream.h"#include"stdio.h"#include"stdlib.h"#include"time.h"#define N 100int 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;}int f3(int m,int n){int i, factor = 1;for (i = 2; i <= m && i <= n; i++){while (m % i == 0 && n % i == 0) //此处不能用if语句{factor = factor * i;m = m / i; n = n / i;w3++;}}return factor;}int main(void){int m,n;printf(" 请输入m,n :\n");scanf("%d%d",&m,&n);int k;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");float a,i;clock_t start,finish;double usetime;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); }结果:(示例)。

c语言求两个数最大公约数,穷举法的时间复杂度

c语言求两个数最大公约数,穷举法的时间复杂度

c语言求两个数最大公约数,穷举法的时间复杂度C语言求两个数最大公约数,穷举法的时间复杂度在计算机科学领域中,我们经常需要解决各种数学问题,例如求两个数的最大公约数。

而在C语言中,我们可以使用穷举法(也称为暴力法)来求解最大公约数。

在本篇文章中,我们将深入探讨C语言中求两个数最大公约数的问题,并分析穷举法的时间复杂度。

1. 最大公约数的概念最大公约数指的是两个或多个整数共有约数中最大的一个。

在数学上,常用的求最大公约数的方法有辗转相除法、更相减损术和质因数分解法等。

而在计算机科学中,我们可以使用穷举法来求解最大公约数。

下面,我们将以C语言为例,介绍如何使用穷举法来求解两个数的最大公约数。

2. C语言求最大公约数在C语言中,我们可以使用穷举法来求解两个数的最大公约数。

穷举法的基本思路是从较小的数开始,逐渐减小,直到找到两个数的一个公约数为止。

以下是一个简单的C语言程序示例:```c#include <stdio.h>int gcd(int a, int b) {int min = a < b ? a : b;int max = a > b ? a : b;int result = 0;for (int i = 1; i <= min; i++) {if (min % i == 0 && max % i == 0) {result = i;}}return result;}int main() {int a, b;printf("请输入两个整数:");scanf("%d %d", &a, &b);printf("它们的最大公约数是:%d\n", gcd(a, b)); return 0;}```3. 穷举法的时间复杂度穷举法的时间复杂度可以通过一个简单的分析得出。

在上面的C语言程序中,我们使用了一个for循环来进行穷举。

求最大公约数

求最大公约数

求最大公约数最大公约数(Greatest Common Divisor,简称GCD),又称最大公因数,是指两个或多个整数共有约数中最大的一个。

求最大公约数在数学和计算机领域有着广泛的应用。

本文将介绍求最大公约数的常见方法及其实现。

一、辗转相除法辗转相除法,也称欧几里德算法,是求最大公约数的一种常用方法。

其基本原理是在两个正整数a和b(a>b)的前提下,通过取模运算找出两者的余数c,再将b赋值给a,c赋值给b,重复这个过程直到余数为0为止。

最终得到的非零余数即为这两个正整数的最大公约数。

下面是使用辗转相除法求最大公约数的伪代码:```function gcd(a, b)while b 不等于 0令 c = a % b令 a = b令 b = c返回 a```在实现中,我们可以使用递归或迭代的方式来求解最大公约数。

二、欧几里德扩展算法除了辗转相除法,欧几里德扩展算法是另一种常见的求最大公约数的方法。

欧几里德扩展算法不仅可以求得最大公约数,还可以得到最大公约数的系数。

对于两个正整数a和b,假设它们的最大公约数为d,则欧几里德扩展算法可以找到一对整数x和y,满足以下等式:ax + by = d其中x和y可以是任意整数解。

欧几里德扩展算法的基本思想是利用辗转相除法求得最大公约数的同时,通过递归的方式不断更新x和y的值,直至求得满足上述等式的解。

下面是使用欧几里德扩展算法求最大公约数及其系数的伪代码:```function extended_gcd(a, b)if b 等于 0返回 (a, 1, 0)else(d, x', y') = extended_gcd(b, a % b)返回 (d, y', x' - (a // b) * y')```其中,(d, x, y)即为最大公约数以及其系数。

三、质因数分解法质因数分解法是求最大公约数的另一种常见方法。

它的基本思想是将两个数分别进行质因数分解,然后比较两个数的质因数的交集,将交集中的质因数相乘即可得到最大公约数。

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

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

最大公约数的三种算法复杂度分析时间计算1.辗转相除法(欧几里得算法)辗转相除法是一种基于递归的算法,它通过不断地用两个数中较大的数除以较小的数,直到两个数相等为止。

这时,较小的数就是最大公约数。

例如,求解49和28的最大公约数:-49÷28=1 (21)-28÷21=1 (7)-21÷7=3 0所以最大公约数为7辗转相除法的时间复杂度分析如下:设两个数中较大的数为a,较小的数为b,a mod b 的结果为r。

- 最好情况:当b能够整除a时,时间复杂度为O(loga),因为每次递归时a和b的值都会减少至原来的一半。

-最坏情况:当a和b互质时,时间复杂度为O(a/b)。

例如,当a=2n 时,每次递归的b的值都会减少至1- 平均情况:时间复杂度是O(logab)的。

2.更相减损术更相减损术是一种基于减法的算法,它通过不断地用两个数中较大的数减去较小的数,直到两个数相等为止。

这时,较小的数就是最大公约数。

例如,求解49和28的最大公约数:-28-21=7-21-7=14-14-7=7所以最大公约数为7更相减损术的时间复杂度分析如下:设两个数中较大的数为a,较小的数为b。

- 最好情况:当a和b的差值为1时,时间复杂度为O(logb),因为每次减法操作后的差值都会减少一半。

-最坏情况:当a和b互质时,时间复杂度为O(a-b)。

例如,当a=2n 时,每次减法操作的差值都会减少至1-平均情况:时间复杂度为O(a-b)的。

3. Stein算法(二进制法)Stein算法是一种基于位运算的算法,它通过在两个数中同时除去2的因子,直到两个数都变为奇数。

然后,继续用较小的数减去较大的数,直到两个数相等为止。

这时,较小的数就是最大公约数的2的因子。

例如,求解49和28的最大公约数:-49÷2=24-28÷2=14-24÷2=12现在两个数都是奇数,继续减法操作:-7-12=-5-12-7=5所以最大公约数为5Stein算法的时间复杂度分析如下:设两个数中较大的数为a,较小的数为b。

最大公约数计算方法

最大公约数计算方法

最大公约数计算方法最大公约数(Greatest Common Divisor,简称GCD)是数学中的一个重要概念,指两个或多个整数共有约数中最大的一个。

在日常生活和编程中,我们经常需要计算两个数的最大公约数。

本文将详细介绍最大公约数的计算方法。

一、列举法列举法是最直观的计算最大公约数的方法。

首先,分别列出两个数的所有约数,然后找出最大的共同约数。

例如,计算48和18的最大公约数:48的约数有:1,2,3,4,6,8,12,16,24,4818的约数有:1,2,3,6,9,18最大公约数为6。

二、辗转相除法(也称欧几里得算法)辗转相除法是一种更高效的计算最大公约数的方法。

具体步骤如下:1.将两个数a和b进行比较,使a≥b。

2.用a除以b,得到余数r(0≤r<b)。

3.若r=0,则b即为两数的最大公约数。

4.若r≠0,则用b除以r,得到新的余数。

5.重复步骤2和3,直到余数为0。

例如,计算48和18的最大公约数:48 ÷ 18 = 2 余数1218 ÷ 12 = 1 余数612 ÷ 6 = 2 余数0因此,最大公约数为6。

三、更相减损术更相减损术是中国古代数学家发明的一种计算最大公约数的方法。

具体步骤如下:1.将两个数a和b进行比较,使a≥b。

2.用a减去b,得到差值c。

3.若c等于b,则b即为两数的最大公约数。

4.若c大于b,则用c减去b,得到新的差值。

5.重复步骤2和3,直到差值等于b。

例如,计算48和18的最大公约数:48 - 18 = 3030 - 18 = 1218 - 12 = 6因此,最大公约数为6。

四、使用编程语言计算最大公约数在许多编程语言中,都有现成的函数或方法可以计算最大公约数。

例如,在Python中,可以使用math模块的gcd函数计算最大公约数:```pythonimport matha = 48b = 18print(math.gcd(a, b)) # 输出结果为6```总结:最大公约数的计算方法有多种,包括列举法、辗转相除法、更相减损术等。

求最大公约数的三种方法

求最大公约数的三种方法

求最大公约数的三种方法最大公约数是指在两个或多个整数中,能够同时被整除的最大正整数。

在生活中,常常需要求两个数的最大公约数,而计算最大公约数有多种方法,下面将介绍最常用的三种方法。

方法一:质因数分解法这是一种经典的求最大公约数的方法,它的核心思想是通过将两个数分别分解成质因数,然后将它们的公共质因数提出来,最后再将这些公共质因数相乘,得到的结果就是最大公约数。

举个例子,假设要求65和78的最大公约数,首先分别分解成质因数:65=5×1378=2×3×13然后将它们的公共质因数提出来,即13,因此它们的最大公约数就是13。

这种方法的优点在于,它的计算过程简单、直观,而且适用于所有的正整数。

但是,对于较大的数字,质因数分解的时间成本较高,所以这种方法的效率较低。

方法二:辗转相除法辗转相除法是一种古老的求最大公约数的方法,其原理是通过连续地做减法和取模运算,将两个数逐渐缩小为它们的最大公约数。

具体的计算步骤如下,假设要求65和78的最大公约数:1. 用较大数除以较小数,并将余数作为新的被除数;2. 将上一步的余数和原来的被除数继续做取模运算,直到余数为0为止;3. 最后被除数就是最大公约数。

根据上面的例子,可以得到以下计算过程:78÷65=1 (13)65÷13=5 0因此,65和78的最大公约数就是13。

这种方法的优点在于,它的计算速度较快,尤其是对于大数的计算。

但是,其计算过程较为抽象,不太容易理解。

综上,无论使用何种方法求最大公约数,都应根据实际问题的情况选择合适的方法,以达到计算效率和准确度的最佳平衡点。

掌握最大公约数与最小公倍数的计算方法

掌握最大公约数与最小公倍数的计算方法

掌握最大公约数与最小公倍数的计算方法最大公约数(Greatest Common Divisor, GCD)和最小公倍数(Least Common Multiple, LCM)是数学中两个重要的概念。

掌握它们的计算方法对于解决一些实际问题和数学推理有着重要的作用。

本文将介绍最大公约数与最小公倍数的定义、计算方法和应用。

一、最大公约数的定义与计算方法最大公约数是指两个或多个整数中能够整除所有这些整数的最大的正整数。

例如,对于整数12和18,它们的最大公约数是6。

常用的计算最大公约数的方法有以下几种。

1. 辗转相除法:将两个整数中较大的数除以较小的数,将余数作为新的被除数,将原先的除数作为新的除数,重复这个步骤,直到余数为0时,最后的除数就是最大公约数。

2. 公因数法:列举出两个整数的所有因数,找出它们的公共因数中的最大的一个就是最大公约数。

3. 质因数分解法:将两个整数分别用质因数相乘的形式表示,然后取两个数中所有质因数的交集,将交集中的质因数相乘得到的数就是最大公约数。

以上三种方法都能够有效地计算出最大公约数,具体使用哪种方法可以根据实际情况选择。

二、最小公倍数的定义与计算方法最小公倍数是指两个或多个整数中能够被这些整数整除的最小的正整数。

例如,对于整数3和5,它们的最小公倍数是15。

最小公倍数的计算方法主要有以下几种。

1. 分解质因数法:将两个整数分别用质因数相乘的形式表示,取两者质因数的并集,将并集中的质因数相乘得到的数就是最小公倍数。

2. 公倍数法:列举出两个整数的倍数,找出它们的公共倍数中的最小的一个就是最小公倍数。

与计算最大公约数类似,计算最小公倍数时也可以根据实际情况选择合适的方法。

三、最大公约数与最小公倍数的应用最大公约数与最小公倍数的应用广泛。

在计算中,常常需要将分数进行化简,这就需要用到最大公约数。

最大公约数还可以用于简化分数运算、求解同余方程等。

最小公倍数在数学中的应用较多,如求解车轮转速、计算周期性事件的时间等。

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

昆明理工大学信息工程与自动化学院学生实验报告(2011 —2012 学年第 1 学期)课程名称:算法设计与分析开课实验室:信自楼机房444 2011 年10月 12日一、上机目的及内容1.上机内容求两个自然数m和n的最大公约数。

2.上机目的(1)复习数据结构课程的相关知识,实现课程间的平滑过渡;(2)掌握并应用算法的数学分析和后验分析方法;(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。

二、实验原理及基本技术路线图(方框原理图或程序流程图)(1)至少设计出三个版本的求最大公约数算法;(2)对所设计的算法采用大O符号进行时间复杂性分析;(3)上机实现算法,并用计数法和计时法分别测算算法的运行时间;(4)通过分析对比,得出自己的结论。

三、所用仪器、材料(设备名称、型号、规格等或使用软件)1台PC及VISUAL C++6.0软件四、实验方法、步骤(或:程序代码或操作过程)实验采用三种方法求最大公约数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;}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<n){if(n%i==0){j++;a[j]=i;n=n/i;}else i++;}j++;a[j]=n;i=1;int u;u=j;while(i<=j){//printf("%d ",a[i]); i++;}i=2;j=0;while(i<m){if(m%i==0){j++;b[j]=i;m=m/i;}else i++;}j++;b[j]=m;i=1;while(i<=j){//printf("%d ",b[i]); 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("%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];return k;}else return k;}根据代码分解质因子算法O(n)=n2+n/2为了计算每种算法运行的次数所用的时间,我将代码稍加改动添加代码如下:其中计数器采用的是没做一次循环就加1;计时器是记住开始时间和结束时间,用结束时间减开始时间。

#include"iostream.h"#include"stdio.h"#include"stdlib.h"#include"time.h"#define N 100int 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;}int f3(int m,int n){int i=2,j=0,h=0;int a[N],b[N],c[N];while(i<n){if(n%i==0){j++;a[j]=i;n=n/i;w3++;}else{i++;w3++;}}j++;a[j]=n;i=1;int u;u=j;while(i<=j){//printf("%d ",a[i]);i++;w3++;}//printf("\n");i=2;j=0;while(i<m){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++;}int k=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];return k;}else return k;}int main(void){int m,n;printf(" 请输入m,n :\n");scanf("%d%d",&m,&n);int k;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");float a,i;clock_t start,finish;double usetime;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)的分析。

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

相关文档
最新文档