求两个数的最大公约数算法

合集下载

求两个数m和n的最大公约数流程图

求两个数m和n的最大公约数流程图

求两个数m和n的最大公约数流程图在数学中,最大公约数是指两个或多个整数共有约数中最大的一个。

求两个数m和n的最大公约数是数论中的一个重要问题,也是数学中的基础知识之一。

在实际生活中,我们经常会遇到需要求最大公约数的情况,比如简化分数、约简比例等,因此掌握求最大公约数的方法是很有必要的。

下面我们将介绍一种常用的求两个数m和n的最大公约数的方法,并通过流程图来展示整个求解过程。

首先,我们需要了解两个数m和n的最大公约数的定义。

两个整数的最大公约数,即为能够同时整除这两个数的最大正整数。

例如,两个数36和48的最大公约数为12,因为12是36和48的约数中最大的一个。

接下来,我们将通过欧几里得算法来求解两个数m和n的最大公约数。

欧几里得算法,又称辗转相除法,是一种用于计算两个非负整数的最大公约数的算法。

其基本思想是通过连续的求余运算,直到余数为0为止,最后的除数即为最大公约数。

下面是求两个数m和n的最大公约数的流程图:```flow。

st=>start: 开始。

input=>inputoutput: 输入两个数m和n。

cond1=>condition: 是否m大于n?op1=>operation: 交换m和n的值。

cond2=>condition: n是否等于0?op2=>operation: 输出m为最大公约数。

op3=>operation: 求m除以n的余数。

op4=>operation: 交换m和n的值。

e=>end: 结束。

st->input->cond1。

cond1(yes)->op3->cond2。

cond1(no)->cond2。

cond2(yes)->op2->e。

cond2(no)->op4->cond1。

```。

根据上面的流程图,我们可以清晰地看到求解两个数m和n的最大公约数的整个过程。

输入两个正整数m和n,求其最大公约数和最小公倍数

输入两个正整数m和n,求其最大公约数和最小公倍数

输入两个正整数m和n,求其最大公约数和最小公倍

求m和n的最大公约数和最小公倍数:最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。

求两个正整数m和n的最大公约数可用欧几里德算法(辗转相除法)。

求两个正整数m和n的最小公倍数=两个数的乘积÷两个数的最大公约数。

用欧几里德算法(辗转相除法)求两个数的最大公约数的步骤如下:
先用小的一个数除大的一个数,得第一个余数;
再用第一个余数除小的一个数,得第二个余数;
又用第二个余数除第一个余数,得第三个余数;
这样逐次用后一个数去除前一个余数,直到余数是0为止。

那么,最后一个除数就是所求的最大公约数(如果最后的除数是1,那么原来的两个数是互质数)。

两个正整数的最小公倍数=两个数的乘积÷两个数的最大公约数。

由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。

这就是说,求两个数的最小公倍数,可以先求出两个数的最大公约数,再用这两个数的最大公约数去除这两个数的积,所得的商就是两个数的最小公倍数。

怎么求两个数的最大公约数

怎么求两个数的最大公约数

怎么求两个数的最大公约数方法1:辗转相除法(欧几里得算法)欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。

其计算原理依赖于下面的定理:定理:gcd(a,b) = gcd(b,a mod b)证明:a可以表示成a = kb + r,则r = a mod b假设d是a,b的一个公约数,则有d|a, d|b,而r = a - kb,因此d|r因此d是(b,a mod b)的公约数假设d 是(b,a mod b)的公约数,则d | b , d |r ,但是a = kb +r因此d也是(a,b)的公约数因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证方法2:更相减损术更相减损法:更相减损术,出自于中国古代的《九章算术》,也是一种求最大公约数的算法。

①先判断两个数的大小,如果两数相等,则这个数本身就是就是它的最大公约数。

②如果不相等,则用大数减去小数,然后用这个较小数与它们相减的结果相比较,如果相等,则这个差就是它们的最大公约数,而如果不相等,则继续执行②操作。

方法3:Stein算法(结合辗转相除法和更相减损法的优势以及移位运算)众所周知,移位运算的性能非常快。

对于给定的正整数a和b,不难得到如下的结论。

其中gcb(a,b)的意思是求a,b的最大公约数的函数当a和b均为偶数,gcb(a,b) = 2gcb(a/2, b/2) = 2gcb(a>>1, b>>1) 当a为偶数,b为奇数,gcb(a,b) = gcb(a/2, b) = gcb(a>>1, b) 当a为奇数,b为偶数,gcb(a,b) = gcb(a, b/2) = gcb(a, b>>1) 当a和b均为奇数,利用更相减损术运算一次,gcb(a,b) = gcb(b, a-b),此时a-b的结果必然是偶数,又可以继续进行移位运算。

输入两个正整数m和n,求其最大公约数和最小公倍数

输入两个正整数m和n,求其最大公约数和最小公倍数

输入两个正整数m和n,求其最大公约数和最小公倍数最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。

求两个正整数m和n的最大公约数可用欧几里德算法(辗转相除法)。

求两个正整数m和n的最小公倍数=两个数的乘积÷两个数的最大公约数。

用欧几里德算法(辗转相除法)求两个数的最大公约数的步骤如下:先用小的一个数除大的一个数,得第一个余数;再用第一个余数除小的一个数,得第二个余数;又用第二个余数除第一个余数,得第三个余数;这样逐次用后一个数去除前一个余数,直到余数是0为止。

那么,最后一个除数就是所求的最大公约数(如果最后的除数是1,那么原来的两个数是互质数)。

两个正整数的最小公倍数=两个数的乘积÷两个数的最大公约数。

由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。

这就是说,求两个数的最小公倍数,可以先求出两个数的最大公约数,再用这两个数的最大公约数去除这两个数的积,所得的商就是两个数的最小公倍数。

main(){int p,r,n,m,temp;printf("Please enter 2 numbers n,m:");scanf("%d,%d",&n,&m);//输入两个正整数.if(n\u003cm)//把大数放在n中,把小数放在m中. {temp=n;n=m;m=temp;}p=n*m;//P是原来两个数n,m的乘积.while(m!=0)//求两个数n,m的最大公约数.{r=n%m;n=m;m=r;}printf("Its MAXGongYueShu:%d\\n",n);//打印最大公约数. printf("Its MINGongBeiShu:%d\\n",p/n);打印最小公倍数.。

最大公约数的算法

最大公约数的算法

最大公约数的算法.1、查找约数法.先分别找出每个数的所有约数,再从两个数的约数中找出公有的约数,其中最大的一个就是最大公约数.例如,求12和30的最大公约数.12的约数有:1、2、3、4、6、12;30的约数有:1、2、3、5、6、10、15、30.12和30的公约数有:1、2、3、6,其中6就是12和30的最大公约数.2 更相减损术《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。

以等数约之。

”翻译成现代语言如下:第一步:任意给定两个正整数;判断它们是否都是偶数。

若是,则用2约简;若不是则执行第二步。

第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。

继续这个操作,直到所得的减数和差相等为止。

则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。

其中所说的“等数”,就是最大公约数。

求“等数”的办法是“更相减损”法。

3、辗转相除法.辗转相除法适用比较广,比短除法要好得多,它能保证求出任意两个数的最大公约数.4、求差判定法.如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数是6,所以78和60的最大公约数是6.如果两个数相差较大,可以用大数减去小数的若干倍,一直减到差比小数小为止,差和小数的最大公约数就是原来两数的最大公约数.例如:求92和16的最大公约数.92-16=76,76-16=60,60-16=44,44-16=28,28-16=12,12和16的最大公约数是4,所以92和16的最大公约数就是4.5、分解因式法.先分别把两个数分解质因数,再找出它们全部公有的质因数,然后把这些公有质因数相乘,得到的积就是这两个数的最大公约数.例如:求125和300的最大公约数.因为125=5×5×5,300=2×2×3×5×5,所以125和300的最大公约数是5×5=25.6、短除法.为了简便,将两个数的分解过程用同一个短除法来表示,那么最大公约数就是所有除数的乘积.例如:求180和324的最大公约数.因为:5和9互质,所以180和324的最大公约数是4×9=36.7、除法法.当两个数中较小的数是质数时,可采用除法求解.即用较大的数除以较小的数,如果能够整除,则较小的数是这两个数的最大公约数.例如:求19和152,13和273的最大公约数.因为152÷19=8,273÷13=21.(19和13都是质数.)所以19和152的最大公约数是19,13和273的最大公约数是13.8、缩倍法.如果两个数没有之间没有倍数关系,可以把较小的数依次除以2、3、4……直到求得的商是较大数的约数为止,这时的商就是两个数的最大公约数.例如:求30和24的最大公约数.24÷4=6,6是30的约数,所以30和24的最大公约数是6.。

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

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

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

计算两个数的最大公约数c语言

计算两个数的最大公约数c语言

计算两个数的最大公约数c语言最大公约数,简称公约数,是指一个数可以整除两个数的最大正整数。

在数学中,最大公约数是两个或多个整数的公有约数中最大的一个。

在计算机科学中,求两个数的最大公约数是一个非常常见的问题,它有很多种解法,比如辗转相除法、欧几里德算法等。

下面我将介绍C 语言中使用辗转相除法来计算两个数的最大公约数。

辗转相除法,又称欧几里德算法,是求两个正整数的最大公约数的一种方法。

它的基本思想是如果两个整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b的最大公约数。

我们可以使用辗转相除法的递归版本来写一个C语言函数来求两个数的最大公约数。

下面是一个示例:```c#include <stdio.h>//使用辗转相除法递归计算最大公约数int gcd(int a, int b) {if (b == 0) {return a;} else {return gcd(b, a % b);}}int main() {int num1, num2;printf("请输入两个整数:");scanf("%d %d", &num1, &num2);int result = gcd(num1, num2);printf("最大公约数是:%d\n", result); return 0;}```在这个示例中,我们定义了一个名为`gcd`的函数来求两个数的最大公约数。

在`gcd`函数中,如果第二个数等于0,那么第一个数就是最大公约数;否则,我们再次调用`gcd`函数,传入第二个数和第一个数对第二个数取余的结果。

最后,我们在`main`函数中调用`gcd`函数来得到最大公约数,并打印出来。

在C语言中,我们还可以使用非递归的方式来实现辗转相除法。

下面是一个示例:```c#include <stdio.h>//使用辗转相除法非递归计算最大公约数int gcd(int a, int b) {while (b != 0) {int temp = a % b;a = b;b = temp;}return a;}int main() {int num1, num2;printf("请输入两个整数:");scanf("%d %d", &num1, &num2);int result = gcd(num1, num2);printf("最大公约数是:%d\n", result); return 0;}```在这个示例中,我们定义了一个名为`gcd`的函数来求两个数的最大公约数。

辗转相除法求两个整数的最大公约数

辗转相除法求两个整数的最大公约数

辗转相除法求两个整数的最⼤公约数2020新年年初,⼀场疫情让⼈们⽌住了匆忙的脚步。

⼀次在家看初中的在线教育视频,数学课上⽼师讲到⼀种求两个正整数的最⼤公约数的算法:辗转相除法,当时⽼师讲的很好,⾮常易懂,有了理论基础于是想⽤代码的⽅式实现。

以下证明过程与教学视频⽆关。

⼀,辗转相除法「辗转相除法」⼜叫做「欧⼏⾥得算法」,是公元前 300 年左右的希腊数学家欧⼏⾥得在他的著作《⼏何原本》提出的.利⽤这个⽅法,可以较快地求出两个⾃然数的最⼤公因数,即 HCF 或叫做 gcd.所谓最⼤公因数,是指⼏个数的共有的因数之中最⼤的⼀个,例如 8 和 12 的最⼤公因数是 4,记作 gcd(8,12)=4.在介绍这个⽅法之前,先说明整除性的⼀些特点,注以下⽂的所有数都是正整数,以后不再重覆.我们可以这样给出整除以的定义:对於两个⾃然数 a 和 b,若存在正整数 q,使得 a=bq,则 b 能整除 a,记作 b | a,我们叫 b 是 a 的因数,⽽ a 是 b 的倍数.那麼如果 c | a,⽽且 c | b,则 c 是 a 和 b 的公因数.由此,我们可以得出以下⼀些推论:推论⼀:如果 a | b,若 k 是整数,则 a | kb.因为由 a | b 可知 ha=b,所以 (hk)a=kb,即 a | kb.推论⼆:如果 a | b 以及 a | c,则 a | (b±c).因为由 a | b 以及 a | c,可知 ha=b,ka=c,⼆式相加,得 (h+k)a=b+c,即 a | (b+c).同样把⼆式相减可得 a | (b-c).推论三:如果 a | b 以及 b | a,则 a=b.因为由 a | b 以及 b | a,可知 ha=b,a=kb,因此 a=k(ha),hk=1,由於 h 和 k 都是正整数,故 h=k=1,因此 a=b.辗转相除法是⽤来计算两个数的最⼤公因数,在数值很⼤时尤其有⽤⽽且应⽤在电脑程式上也⼗分简单.其理论如下:如果 q 和 r 是 m 除以 n 的商及余数,即 m=nq+r,则 gcd(m,n)=gcd(n,r).证明是这样的:设 a=gcd(m,n),b=gcd(n,r)则有 a | m 及 a | n,因此 a | (m-nq)(这是由推论⼀及推论⼆得出的),即 a | r 及 a | n,所以 a | b⼜ b | r 及 b | n,所以 b | (nq+r),即 b | m 及 b | n,所以b | a.因为 a | b 并且 b | a,所以 a=b,即 gcd(m,n)=gcd(n,r).例如计算 gcd(546,429),由於 546=1(429)+117,429=3(117)+78,117=1(78)+39,78=2(39),因此gcd(546,429)=gcd(429,117)=gcd(117,78)=gcd(78,39)=39最⼩公倍数就是2个数的积除以最⼤公约数框图如下⼆,Java算法实现有了以上的理论基础,算法实现不难,⽤⼀个递归就可以实现,代码如下1public Integer GDC(Integer m, Integer n) {2if (m < n)3 XOR(m, n);45 Integer r = m % n;6if (r > 0) {7return GDC(n, r);8 } else {9return n;10 }11 }1213/**14 * 两个数对换15*/16private void XOR(Integer m, Integer n) {17 m = m ^ n;18 n = m ^ n;19 m = m ^ n;20 }这段代码可以很好的实现求最⼤公约数。

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