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

合集下载

求最大公约数的几种算法

求最大公约数的几种算法

求最⼤公约数的⼏种算法 给定两个整数,求出这两个整数的最⼤公约数是我们从⼩就接触过的问题,但是我们如何⽤更简洁的算法来计算呢? 本⽂中,假定这两个整数是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. 公倍数法:列举出两个整数的倍数,找出它们的公共倍数中的最小的一个就是最小公倍数。

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

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

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

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

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

最大公约数实验报告

最大公约数实验报告
start=litmp.QuadPart;
while(t<1000){
m=Random(k-5,k+5);
n=Random(k-5,k+5);
temp=CommFactor(m,n);
t++;
}
QueryPerformanceCounter(&litmp);
over=litmp.QuadPart;
dfMinus=(double)(over-start);
欧几里得算法的时间复杂性O(log N)
假设m>n,函数会按照gcd(m,n)->gcd(n,m%n)->gcd(m%n,n%(m%n))这样递归下去,当n>m/2时有m%n=m-n<m/2,当n<m/2时则m%n<n<m/2,经过两次递归后,第一个参数要小于原来的一半,所以其复杂度应该在O(log max(m,n))以内。
算法设计与分析
实验报告书
实验名称:求两个自然数m和n的最大公约数
学 号:
姓 名:
实验时间:2015年4月1日
一 实验目的和要求
(1)复习数据结构课程的相关知识,实现课程间的平滑过渡;
(2)掌握并应用算法的数学分析和后验分析方法;
(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。
#include<stdlib.h>
#include<stdio.h>
#include<windows.h>
using namespace std;
double num;
int CommFactor1(int m,int n)

c语言计算最大公约数

c语言计算最大公约数

c语言计算最大公约数C语言的语法简单易学,在计算机程序设计中有着广泛的应用。

其中,求最大公约数是一种经典的算法。

下面,我们来分步骤地探讨如何使用C语言计算最大公约数。

一、辗转相除法求最大公约数的一种方法是使用辗转相除法。

该方法基于以下的定理:对于任意给定的两个正整数p,q(p>q),有:p = q × n + r其中,n为p ÷ q的商,r为p ÷ q的余数。

显然,如果q能够整除p,那么r=0,此时q就是p的最大公约数。

如果r不等于0,那我们就可以将q作为新的p,r作为新的q,继续进行辗转相除操作,直到得到r=0的情况为止。

基于以上的思路,我们可以将求解最大公约数的过程封装为一个函数,该函数的代码如下:```int euclid(int p, int q) {int r = p % q;while (r != 0) {p = q;q = r;r = p % q;}return q;}```在该函数中,我们使用了while循环对p和q进行辗转相除,直到余数r等于0为止。

在每次迭代中,我们将q赋值给p,将r赋值给q,重新计算r的值。

二、更相减损术另一种求最大公约数的方法是使用更相减损术。

该方法基于以下的定理:对于任意给定的两个正整数p,q(p>q),有:gcd(p,q) = gcd(q,p-q)显然,如果q能够整除p,那么p-q=q,此时q就是p的最大公约数。

如果q不能整除p,那我们就可以用p-q代替p,继续进行更相减损术操作,直到得到q=p-q的情况为止。

基于以上的思路,我们可以实现一个使用更相减损术求解最大公约数的函数,该函数的代码如下:```int subtract(int p, int q) {while (p != q) {if (p > q) {p = p - q;} else {q = q - p;}}return p;}```在该函数中,我们使用了while循环对p和q进行更相减损术操作,直到p=q为止。

求最大公约数的两种算法

求最大公约数的两种算法

求最大公约数的两种算法最大公约数(GCD)是指能够同时整除两个或多个整数的最大正整数。

在数学和计算机科学中,求最大公约数是一个常见的问题,并有多种算法可以解决。

以下是两种常见的求最大公约数的算法:1.暴力法:暴力法,也称为穷举法或试除法,是最简单直观的求最大公约数的方法。

该方法使用一个循环来遍历从2到较小的那个数之间所有的可能公约数,然后找到最大的。

算法步骤:-输入两个整数a和b,其中a>=b。

-从2开始,从小到大的顺序依次遍历所有的整数,直到找到最大的公约数。

-对于每一个遍历到的整数i,判断它是否同时整除a和b,如果是则更新最大公约数。

-返回最大公约数。

该算法的时间复杂度取决于较小整数b的大小,即O(b)。

然而,该算法对于较大的整数效率比较低,而且无法处理负整数。

2.辗转相除法(欧几里得算法):辗转相除法是一种通过反复用较小数除较大数,然后用余数去除旧的较小数,直到余数为0的方式来求解最大公约数的算法。

该算法基于下面的原理:两个整数a和b的最大公约数等于b和a mod b的最大公约数。

算法步骤:-输入两个整数a和b,其中a>=b。

- 计算a mod b,使用较小数b去除较大数a,将余数保存下来。

-如果余数为0,则b即为最大公约数。

-如果余数不为0,则将b赋值给a,将余数赋值给b,回到第二步继续计算。

-返回b作为最大公约数。

辗转相除法的时间复杂度较低,约为O(log b)。

它比暴力法更加高效且适用于处理较大整数。

此外,该算法也能正确处理负整数。

这两种算法是求最大公约数最常用的方法,它们在数学和计算机科学的许多领域都有广泛的应用。

可以根据具体情况选择合适的算法来求解最大公约数。

求最大公约数了解最大公约数的求解方法

求最大公约数了解最大公约数的求解方法

求最大公约数了解最大公约数的求解方法最大公约数是指两个或多个数中能够同时整除的最大的正整数。

在数学中,最大公约数的求解方法有欧几里得算法、质因数分解法和辗转相除法等几种常见方法。

下面将逐一介绍这些方法。

一、欧几里得算法欧几里得算法,也称为辗转相除法,是一种用于求解最大公约数的经典算法。

该算法的基本思想是根据两个数的除法余数的性质来进行求解。

1. 欧几里得算法的步骤:a. 取两个整数a和b(a > b);b. 当b不等于0时,用a除以b,得到余数r;c. 若r等于0,则b即为最大公约数;d. 若r不等于0,则令a等于b,b等于r,然后返回步骤b。

2. 示例:假设我们要求解135和225的最大公约数。

a. 根据步骤1,取a=225,b=135;b. 根据步骤2b,计算225除以135的余数,得到r=90;c. 根据步骤2d,令a=135,b=90;d. 根据步骤2b,计算135除以90的余数,得到r=45;e. 根据步骤2d,令a=90,b=45;f. 根据步骤2b,计算90除以45的余数,得到r=0;g. 根据步骤2c,最大公约数为45。

二、质因数分解法质因数分解法是一种将待求最大公约数的两个数分别进行质因数分解的方法,然后找出它们的公共质因数的乘积。

1. 质因数分解法的步骤:a. 将待求最大公约数的两个数分别进行质因数分解;b. 找出它们的公共质因数的乘积。

2. 示例:假设我们要求解48和60的最大公约数。

a. 将48进行质因数分解,得到2^4 * 3;b. 将60进行质因数分解,得到2^2 * 3 * 5;c. 公共质因数的乘积为2^2 * 3 = 12,即为最大公约数。

三、辗转相除法辗转相除法是欧几里得算法的一种变形方法,它可以用于求解两个数的最大公约数。

1. 辗转相除法的步骤:a. 取两个整数a和b(a > b);b. 用a除以b得到商q和余数r;c. 如果r等于0,则b即为最大公约数;d. 如果r不等于0,则令a=b,b=r,并返回步骤b。

3个数最大公约数算法

3个数最大公约数算法

3个数最大公约数算法3个数最大公约数算法介绍在数学中,最大公约数(GCD)是指两个或多个整数的共同因子中最大的那个。

在本文中,我们将讨论如何计算三个整数的最大公约数。

方法一:暴力枚举法暴力枚举法是一种简单而直接的方法。

我们可以从2开始到这三个整数中最小的那一个依次枚举每个正整数,如果这三个整数都能被这个正整数整除,则将其记录为当前的最大公约数。

当我们枚举到1时,即可得到这三个整数的最大公约数。

代码实现:```def gcd(a, b, c):for i in range(2, min(a, b, c) + 1):if a % i == 0 and b % i == 0 and c % i == 0:return 1```该算法虽然简单易懂,但时间复杂度为O(min(a,b,c)),当a、b、c较大时,效率较低。

方法二:辗转相除法辗转相除法是计算两个正整数的最大公约数的常用方法。

其基本思路是用较小的那个正整数去除以较大的那一个正整数,并用余数代替原来较小的那个正整数,不断重复这个过程,直到余数为0为止。

此时,较大的那个正整数就是最大公约数。

对于三个正整数a、b、c,我们可以先求出a和b的最大公约数d1,然后再求出d1和c的最大公约数d2。

因此,我们可以使用两次辗转相除法来计算三个正整数的最大公约数。

代码实现:```def gcd(a, b):if b == 0:else:return gcd(b, a % b)def gcd_three(a, b, c):d1 = gcd(a, b)d2 = gcd(d1, c)return d2```该算法的时间复杂度为O(log(min(a,b,c))),效率较高。

方法三:更相减损术更相减损术也是一种计算两个正整数的最大公约数的方法。

其基本思路是用较小的那个正整数去减去较大的那一个正整数,并用差代替原来较小的那个正整数,不断重复这个过程,直到两个正整数相等为止。

求最大公因数最快方法

求最大公因数最快方法

求最大公因数最快方法最大公因数(GCD)是指两个或多个整数中最大的公约数。

求最大公因数的方法有很多种,包括穷举法、辗转相除法、质因数分解法、更相减损法等。

下面将分别介绍这些方法的原理和优劣势,以及一些其他方法。

1. 穷举法:穷举法是最直观的方法,即对两个整数的所有因数进行穷举,找出它们的公约数中最大的一个。

这个方法的优势是简单易理解,适用于较小的整数。

但当整数较大时,穷举的范围较大,速度较慢。

2. 辗转相除法(欧几里得算法):辗转相除法利用了两个整数之间的整除关系,即两个整数a和b(a>b),它们的最大公约数等于b与a%b的最大公约数。

通过不断地将较大数与余数计算最大公约数,直到余数为0,则较小的数即为最大公约数。

这个方法的优势在于计算速度较快,适用于大整数。

但当两个整数相差很大时,此方法可能效率较低。

3. 更相减损法:更相减损法是一种辗转相减的方法,它使用的原理是任何一个奇数减去另一个奇数的差是偶数,一个奇数减去一个偶数的差是奇数。

因此,我们可以不断地将两个整数中较大的减去较小的,直到两个整数相等,这时的整数即为最大公约数。

这个方法的优势在于可以减少除法运算,但当两个整数相差很大时,辗转相减的次数较多,效率较低。

4. 质因数分解法:质因数分解法是将两个整数进行质因数分解,然后找出它们公共的质因数,再将这些质因数相乘。

这个方法的优势在于可以避免不必要的除法运算,尤其对于较大的整数来说,计算速度较快。

但它的劣势在于复杂度较高,需要先将两个整数进行质因数分解。

除了上述传统的方法,还有一些更高效的方法,如辗转相减法与移位法相结合的二进制算法和Stein算法等。

这些方法主要基于更相减法和移位运算的思想,利用位运算和递归来提高计算速度。

它们的优势在于减少了运算次数和数据规模,适用于非常大的整数。

总而言之,要确定最大公因数最快的方法,需要根据具体情况选择合适的算法。

对于小整数,穷举法和辗转相除法都是简单有效的选择;对于大整数,质因数分解法和二进制算法等更高级的方法能够提供更快的计算速度。

更相减损法与辗转相除法的GCD计算时间复杂度对比

更相减损法与辗转相除法的GCD计算时间复杂度对比

更相减损法与辗转相除法的GCD计算时间复杂度对

更相减损法和辗转相除法在计算最大公约数(GCD)时的时间复杂度分析如下:
更相减损法
更相减损法的时间复杂度通常认为是O(max(a,b)),这是因为它在最坏的情况下需要连续从较大的数中减去较小的数,直到两者相等。

如果两个数a和b相差悬殊(比如a远大于b),那么可能需要接近a-b次减法操作才能使得两数相等。

虽然在实际应用中,这种情况可能并不常见,但理论上,更相减损法的时间复杂度是与输入数值的最大值成线性关系的。

然而,也有一种观点认为,如果我们在更相减损法中应用一些优化(比如,当两数奇偶性不同时,总是将偶数除以2,这实际上是更相减损法与二进制GCD算法的一个结合),那么其时间复杂度可以降低。

但在不引入这种额外优化的情况下,我们通常认为其时间复杂度为O(max(a,b))。

辗转相除法(欧几里得算法)
辗转相除法的时间复杂度是O(log(min(a,b))),也可以近似地看作是O(log(max(a,b)))。

这是因为每次迭代都会将问题的规模减小到一个更小的数(具体来说,是除法的余数),而余数通常是远小于被除数的。

因此,随着迭代的进行,问题的规模会以对数级的速度减小,直到余数为0,此时就找到了最大公约数。

具体来说,每次迭代都至少将问题的规模减半(在最坏的情况下,余数接近被除数的一半,但通常会更小),因此总的迭代次数是对数级别的。

这就是为什么辗转相除法在大多数情况下都是计算最大公约数的首选算法。

综上所述,辗转相除法在计算最大公约数时的时间复杂度远低于更相减损法,因此在实际应用中更加高效。

两个数的最大公约数与最小公倍数总结

两个数的最大公约数与最小公倍数总结

两个数的最大公约数与最小公倍数总结最大公约数(GCD)和最小公倍数(LCM)是数学中常见的概念,用于求解数学问题和简化分数等运算。

本文将总结两个数的最大公约数和最小公倍数的求解方法和性质。

一、最大公约数最大公约数是指两个或多个整数中能够同时整除它们的最大正整数。

求解最大公约数有多种方法,包括质因数分解法、辗转相除法和更相减损法等。

质因数分解法:将两个数分别进行质因数分解,然后找出它们的公因数中的最大值作为最大公约数。

例如,对于数12和18,将其分解质因数可得12=2^2 * 3,18=2 * 3^2,它们的公因数为2和3,因此最大公约数为3。

辗转相除法:两个整数a和b(其中a>b),求它们的最大公约数可以通过以下步骤进行迭代计算:1. 用较大的数a除以较小的数b,得到商q和余数r(a=bq+r);2. 如果余数r等于0,则b即为最大公约数;3. 如果余数r不等于0,则将a赋值为b,b赋值为r,然后继续执行步骤1,直到余数r等于0。

更相减损法:两个整数a和b(其中a>b),求它们的最大公约数可以通过以下步骤进行迭代计算:1. 如果a和b相等,则它们即为最大公约数;2. 如果a和b不相等,则用较大的数a减去较小的数b,得到差d;3. 将d和较小的数b比较,重复执行步骤2,直到d和b相等为止;4. d即为最大公约数。

最大公约数的性质:1. 最大公约数是两个数的公共因数中最大的一个。

2. 如果两个数中有一个为0,则它们的最大公约数为另一个数的绝对值。

3. 两个数的最大公约数的乘积与它们的最小公倍数的积等于两个数的乘积。

二、最小公倍数最小公倍数是指两个或多个整数中能够被它们同时整除的最小正整数。

求解最小公倍数的方法主要有质因数分解法和公式法。

质因数分解法:将两个数分别进行质因数分解,然后将它们的质因数按照次数最多的情况相乘,得到的结果即为最小公倍数。

例如,对于数12和18,将其分解质因数可得12=2^2 * 3,18=2 * 3^2,共有2个2和2个3,因此最小公倍数为2^2 * 3^2 = 36。

数组的最大公约数

数组的最大公约数

数组的最大公约数数组的最大公约数是指数组中所有元素的最大公约数。

在计算机科学中,最大公约数是一种常见的算法,用于计算两个或多个整数的最大公约数。

在这篇文章中,我们将讨论如何计算一个数组的最大公约数。

首先,我们需要了解什么是最大公约数。

最大公约数是指两个或多个整数的最大公因数。

例如,12和18的最大公约数是6,因为6是12和18的公因数中最大的一个。

计算一个数组的最大公约数需要使用一个算法。

以下是一个简单的算法:1. 找到数组中最小的数。

2. 从1到最小数之间的每个数依次遍历,检查它们是否是数组中所有数的公约数。

3. 如果一个数是所有数的公约数,则将其保存为当前的最大公约数。

4. 返回最大公约数。

这个算法的时间复杂度是O(nm),其中n是数组中的元素数量,m是数组中最小元素的大小。

这个算法的效率并不高,因为它需要遍历整个数组,并检查每个数是否是所有数的公约数。

另一个更高效的算法是欧几里得算法,也称为辗转相除法。

这个算法的基本思想是,如果a和b是两个整数,且a>b,则a和b的最大公约数等于b和a%b的最大公约数。

例如,12和18的最大公约数等于18和12%18=6的最大公约数,即6。

使用欧几里得算法计算一个数组的最大公约数的步骤如下:1. 找到数组中最小的数。

2. 从1到最小数之间的每个数依次遍历,检查它们是否是数组中所有数的公约数。

3. 如果一个数是所有数的公约数,则将其保存为当前的最大公约数。

4. 对最大公约数和数组中的下一个数执行欧几里得算法,得到它们的最大公约数。

5. 重复步骤4,直到遍历完整个数组。

这个算法的时间复杂度是O(nlogm),其中n是数组中的元素数量,m是数组中最小元素的大小。

这个算法的效率比第一个算法高得多,因为它使用了欧几里得算法的优化。

在实际应用中,我们可以使用递归来实现欧几里得算法。

以下是一个使用递归实现欧几里得算法的示例代码:int gcd(int a, int b) {if (b == 0) {return a;} else {return gcd(b, a % b);}}int arrayGcd(int[] arr) {int result = arr[0];for (int i = 1; i < arr.length; i++) {result = gcd(result, arr[i]);}return result;}```这个代码使用了递归来计算两个整数的最大公约数,然后在循环中使用它来计算整个数组的最大公约数。

求解最大公约数问题

求解最大公约数问题

求解最大公约数问题最大公约数(Greatest Common Divisor, 简称GCD)是数论中一个重要的概念,用来表示两个或多个整数中最大的能够同时整除它们的正整数。

在数学和计算机科学领域,求解最大公约数问题有着广泛的应用,包括简化分数、判断两个数是否互质、简化矩阵等。

求解最大公约数的问题可以使用多种方法和算法来解决,下面将介绍其中的几种常用算法。

一、欧几里得算法(辗转相除法)欧几里得算法是求解最大公约数问题最常用的算法之一。

该算法基于一个简单的原理:两个整数a和b(a > b)的最大公约数等于a除以b的余数c和b之间的最大公约数。

具体步骤如下:1. 将较大的数a除以较小的数b,得到商q和余数c;2. 如果余数c等于0,则b即为最大公约数;3. 如果余数c不等于0,则将b赋值给a,将余数c赋值给b,然后继续进行第1步。

欧几里得算法的复杂度较低,适用于大部分正整数的最大公约数求解。

二、更相减损术法更相减损术法也是一种古老的求解最大公约数的方法。

该方法基于一个简单的原理:两个整数a和b(a > b)的最大公约数等于a减去b的差d和b之间的最大公约数。

具体步骤如下:1. 如果a等于b,则a即为最大公约数;2. 如果a不等于b,则计算两者之间的差d,将较大数赋值给a,将差d赋值给b,然后继续进行第1步。

更相减损术法的应用范围有限,对于较大的数值可能会出现较大的差值,导致算法效率降低。

三、辗转相减法和移位结合辗转相减法和移位结合是一种结合了欧几里得算法和更相减损术法的改进算法。

该算法的主要思想是在更相减损术法的基础上添加了位移操作,以减少差值的大小。

具体步骤如下:1. 如果a和b均为偶数,则a和b同时右移一位,继续进行该步骤,直到其中一个数为奇数;2. 如果a为偶数、b为奇数,则将a右移一位,继续进行该步骤,直到a为奇数;3. 如果b为偶数、a为奇数,则将b右移一位,继续进行该步骤,直到b为奇数;4. 此时,再使用更相减损术法计算a和b的差值d,并替换其中较大的数为d;5. 重复上述步骤,直到a和b相等,该相等的值即为最大公约数。

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

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

昆明理工大学信息工程与自动化学院学生实验报告( 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;计时器是记住开始时间和结束时间,用结束时间减开始时间。

约数的最大公约数

约数的最大公约数

约数的最大公约数1. 引言在数学中,约数是指能够整除一个数的所有整数,而最大公约数是指两个或多个整数共有的约数中最大的一个。

本文将探讨约数的最大公约数的概念、性质和计算方法,并给出一些实际应用的例子。

2. 约数和最大公约数的定义2.1 约数的定义给定一个整数a,如果存在整数b使得b能够整除a,那么b就是a的约数。

换句话说,如果a能够被b整除,那么b是a的约数。

例如,整数12的约数有1、2、3、4、6和12。

2.2 最大公约数的定义给定两个整数a和b,它们的最大公约数是能够同时整除a和b的最大整数。

最大公约数通常用符号gcd(a, b)表示,其中gcd代表”最大公约数”,a和b是要求最大公约数的两个整数。

例如,整数12和18的最大公约数是6,可以表示为gcd(12, 18) = 6。

3. 最大公约数的性质最大公约数具有一些重要的性质,这些性质对于计算最大公约数和解决实际问题非常有用。

3.1 互质性如果两个整数a和b的最大公约数是1,那么它们被称为互质数(又称互素)。

互质数的一个重要性质是,它们没有除了1以外的公约数。

这意味着互质数的最大公约数只能是1。

例如,整数12和35是互质数,因为它们的最大公约数是1。

3.2 最大公约数的整除性对于任意三个整数a、b和c,如果a能够整除b,那么gcd(a, b)也能够整除c。

这个性质对于计算最大公约数非常有用,因为它可以帮助我们简化问题。

我们可以先计算a和b的最大公约数,然后再用最大公约数来计算其他的约数。

3.3 辗转相除法辗转相除法是一种常用的计算最大公约数的方法。

它基于以下观察:如果a能够整除b,那么a也能够整除a和b的余数。

具体的计算步骤如下: 1. 计算a除以b的余数,记为r。

2. 如果r等于0,则b就是最大公约数。

3. 如果r不等于0,则将b赋值给a,将r赋值给b,然后重复步骤1。

例如,计算gcd(12, 18)的过程如下: 1. 18除以12的余数是6,记为r。

  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)的分析。

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

相关文档
最新文档