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

合集下载

求最大公约数的两种算法

求最大公约数的两种算法

求最大公约数的两种算法最大公约数(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++软件四、实验方法、步骤(或:程序代码或操作过程)实验采用三种方法求最大公约数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++;。

最大公约数的计算方法

最大公约数的计算方法

最大公约数的计算方法最大公约数是数学中的基本概念之一,是指两个或多个数中最大的公约数。

在数学运算中,求解最大公约数是非常重要的,因此有多种计算方法,下面为大家介绍一些简便易行的方法。

一、辗转相除法辗转相除法,也称为欧几里得算法,是求两个数的最大公约数的常用方法之一。

该方法通过逐步取余,不断缩小问题规模,最终得出结果。

具体步骤如下:1. 将两个数中较大的数除以较小的数,得到余数。

2. 将较小的数和余数作为新的两个数,再次执行第一步操作。

3. 重复以上步骤,直到余数为0为止,此时的除数即为最大公约数。

下面以70和45为例,进行演示:1. 70 ÷ 45 = 1 余 252. 45 ÷ 25 = 1 余 203. 25 ÷ 20 = 1 余 54. 20 ÷ 5 = 4 余 0因此,70和45的最大公约数为5。

二、更相减损术更相减损术是中国古代传统的算术方法之一,也适用于求两个整数的最大公约数。

该方法通过不断相减,使得两个数的差趋近于最大公约数。

具体步骤如下:1. 将两个数中较大的数减去较小的数,得到差值。

2. 将较小的数和差值作为新的两个数,再次执行第一步操作。

3. 重复以上步骤,直到两个数相等或其中一个数为0,则最后的数即为最大公约数。

下面以80和56为例,进行演示:1. 80 - 56 = 242. 56 - 24 = 323. 32 - 24 = 84. 24 - 8 = 165. 16 - 8 = 8因此,80和56的最大公约数为8。

三、质因数分解法质因数分解法是将数分解为质因数的乘积,然后根据质因数的公共部分求出最大公约数的方法。

该方法适用于小数的求解。

具体步骤如下:1. 将两个数分别分解为质因数的乘积。

2. 将相同的质因数乘起来,得到公共部分。

3. 公共部分中的质因数乘积即为最大公约数。

下面以28和70为例,进行演示:1. 28 = 2 × 2 × 7,70 = 2 × 5 × 72. 相同的质因数有2和7,2 × 7 = 14因此,28和70的最大公约数为14。

C++丨常见的四种求最大公约数方法!赶紧收藏!

C++丨常见的四种求最大公约数方法!赶紧收藏!

C++⼁常见的四种求最⼤公约数⽅法!赶紧收藏!为了更好的了解算法的概念,今天会分享⼀些C++求最⼤公约数⼏种常见的算法。

第⼀种:穷举法之⼀穷举法,也叫枚举法,求最⼤公约数时从两者中较⼩的数开始,由⼤到⼩列举,直到找到第⼀个公约数为⽌。

解释:拿其中⼀个数出来,⽤⼀个临时变量(tem)保存,每次都把那两个数除以这个临时变量。

如果能除断,直接返回tem;如果不能除断,tem- -,直到都能除断,再返回tem。

tem就是它们的最⼤公约数。

#include <iostream>using namespace std;int CommFactor1(int m, int n); //函数的声明int main(){int a, b;cin >> a >> b;cout << "这两个数的最⼤公约数为:" << CommFactor1(a,b)<< endl;return 0;}int CommFactor1(int m,int n){int tem;for (tem = m;; tem--){if (m % tem == 0 && n % tem == 0){break;}}return tem;}第⼆种:穷举法之⼆解释:求出两数的所有公因⼦,再把公因⼦累乘得到最⼤公约数。

#include <iostream>using namespace std;int CommFactor2(int m, int n); //函数的声明int main(){int a, b;cin >> a >> b;cout << "这两个数的最⼤公约数为:" << CommFactor2(a,b)<< endl;return 0;}int CommFactor2(int m,int n){int i;int 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;}}return factor;}第三种:辗转相除法辗转相除法,⼜称欧⼏⾥得算法。

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

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

最大公约数的三种算法复杂度分析时间计算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。

  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、连续整数检测法。

根据实现提示写代码并分析代码的时间复杂度:方法一: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++;}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;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){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;//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);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;五、实验过程原始记录( 测试数据、图表、计算等)请给出各个操作步骤的截图和说明;三种算法得到结果验证结果:计数器:我想到的是做一次循环就加一计算算法运行时间结果:在计算时间过程中因为计算机的运算速度很快,所以我利用了循环把时间精确得到10-6毫秒六、实验结果、分析和结论(误差分析与数据处理、成果总结等。

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

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

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

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

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

相关文档
最新文档