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

合集下载

求最大公约数的两种算法

求最大公约数的两种算法

求最大公约数的两种算法最大公约数(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)。

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

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

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

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

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循环来进行穷举。

最大公约数的方法及其原理

最大公约数的方法及其原理

最大公约数的方法及其原理
求最大公约数的方法有多种,下面介绍其中两种常用的方法及其原理:
1. 辗转相除法(又称欧几里德算法):假设两个数为a和b,其中a>b。

通过a除以b得到余数r,再用b除以r得到余数
r1,依此类推直到余数为0为止。

此时,b即为最大公约数。

原理:根据辗转相除法,假设a=b*q+r,其中q为商,r为余数(0<=r<b)。

如果c同时是a和b的公约数,那么c也是a 和r的公约数,反之亦然。

因此,可以通过连续除法的过程,不断更新a和b的值,最终得到最大公约数。

2. 更相减损术:假设两个数为a和b,其中a>b。

通过用a-b 得到差c,然后用c和较小的数b进行同样的操作,直到a、b 相等,此时a(或b)即为最大公约数。

原理:更相减损术的思路是将较大数减去较小数,得到一个新的差值。

如果c同时是a和b的公约数,那么c也是b和差值c的公约数,反之亦然。

通过连续的减法操作,最终得到最大公约数。

这两种方法都是经典的求最大公约数的算法,但是辗转相除法相较于更相减损术的效率更高,因此在实际应用中更常使用辗转相除法计算最大公约数。

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

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

昆明理工大学信息工程与自动化学院学生实验报告( 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.辗转相除法(欧几里得算法)辗转相除法是一种基于递归的算法,它通过不断地用两个数中较大的数除以较小的数,直到两个数相等为止。

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

例如,求解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)是指两个或多个整数共有的约数中最大的一个。

在数学中,求最大公约数是一种常见的问题,它在数论、代数、计算机算法等领域都有着重要的应用。

本文将介绍最大公约数的表示方法,帮助读者更好地理解和运用这一概念。

一、欧几里德算法。

欧几里德算法是一种求最大公约数的有效方法。

它基于以下定理,对于任意两个正整数a和b(a>b),它们的最大公约数等于b和a%b的最大公约数,其中%表示取余运算。

利用这一定理,可以通过递归的方式求得最大公约数。

具体步骤如下:1. 若b等于0,则最大公约数为a;2. 否则,计算a%b的值,记为r,然后将b赋值给a,r赋值给b,重复步骤1,直至b等于0。

这一算法简单高效,适用于任意两个正整数的最大公约数计算。

二、质因数分解法。

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

它基于以下定理,若a和b的最大公约数为d,则a和b可以分别表示为a=dm,b=dn,其中m和n互质。

具体步骤如下:1. 将a和b分别进行质因数分解,得到它们的质因数分解式;2. 找出两个数中共有的质因数,并将它们的指数取较小值相乘,得到最大公约数。

通过质因数分解法,可以将最大公约数的求解转化为质因数的比较,简化了计算过程。

三、辗转相除法。

辗转相除法是一种古老的求最大公约数的方法,它基于以下定理,若a和b的最大公约数为d,则a和b可以表示为a=qd,b=rd,其中q和r为整数。

具体步骤如下:1. 用较大数除以较小数,得到商q和余数r;2. 若r等于0,则较小数即为最大公约数;3. 否则,将较小数赋值给较大数,余数赋值给较小数,重复步骤1,直至余数为0。

辗转相除法简单易行,适用于任意两个正整数的最大公约数计算。

四、应用举例。

现假设要求解36和48的最大公约数,可以通过以上方法进行计算。

首先,利用欧几里德算法,可以得到36和48的最大公约数为12;其次,利用质因数分解法,将36和48分别进行质因数分解,得到36=2^23^2,48=2^43,共有的质因数为2^23,最大公约数为12;最后,利用辗转相除法,可以得到36和48的最大公约数为12。

最大公约数计算方法

最大公约数计算方法

最大公约数计算方法最大公约数(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```总结:最大公约数的计算方法有多种,包括列举法、辗转相除法、更相减损术等。

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

昆明理工大学信息工程与自动化学院学生实验报告
( 2011 —2012 学年第 1 学期)
一、上机目的及内容
1.上机内容
求两个自然数m和n的最大公约数。

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

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

三、所用仪器、材料(设备名称、型号、规格等或使用软件)
1台PC及VISUAL C++软件
四、实验方法、步骤(或:程序代码或操作过程)
实验采用三种方法求最大公约数
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)
{
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++;
}
a[j]=n;
i=1;
int u;
u=j;
while(i<=j)
{
*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++;
v1.0 可编辑可修改}
finish=clock();
usetime= finish-start;
printf(" 方法三用时%.f*10^(-6) 豪秒\n", usetime);
}
五、实验过程原始记录( 测试数据、图表、计算等)
请给出各个操作步骤的截图和说明;
三种算法得到结果验证结果:
计数器:我想到的是做一次循环就加一
计算算法运行时间结果:在计算时间过程中因为计算机的运算速度很快,所以我利用了循环把时间精确得到10-6毫秒
六、实验结果、分析和结论(误差分析与数据处理、成果总结等。

其中,绘制曲线图时必须用计算纸或程序运行结果、改进、收获)
请结合实验的结果分析算法原理;在实验中遇到了些什么问题,如何解决;有什么收获等;
在本次实验中代码是独自完成的,一开始我感觉这个代码最多半小时就可以完成,但是第三个算法的时候我分析了好久才写出来,在计算三种方法运行时间的时候,我一开始只精确到毫秒(ms),计算结果都是零,后面我写了一个循环调试才发现是我的精确度还在不够,所以我想到了计算算法执行了1000000次之后所用的时间,然后再求平均每次执行的时间。

结果分析:从前面的复杂度O(n)的出欧几里得算法的是最优算法,连续整除法其次,最复杂的是分解质因数算法,再从代码运行的计数器和计算的时间来看结果恰好和前面的复杂度得到的结果一致,所以的出结论:欧几里得算法最优。

从这次实验的结果我了解到了算法的优与劣的差别,虽然得到的是同样的结果,但是需要的时间和资源却相差很大,这提示我们在以后写算法的时候要找出最优算法。

可见算法分析与设计课程的对计编程的人来说是多么的重要,在以后写程序过程中要时刻提醒自己找最优算法,当然得先学会O(n)的分析。

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

相关文档
最新文档