python求最大公约数三种算法

合集下载

求最大公约数的几种算法

求最大公约数的几种算法

求最⼤公约数的⼏种算法 给定两个整数,求出这两个整数的最⼤公约数是我们从⼩就接触过的问题,但是我们如何⽤更简洁的算法来计算呢? 本⽂中,假定这两个整数是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最⼤公约数的三种算法,希望⼤家互相学习。

python求最大公约数三种算法

python求最大公约数三种算法

python求最大公约数三种算法
1.辗转相除法:
辗转相除法(称为欧几里德算法)是一种常见的最大公约数的计算方法。

它是按照以
下步骤计算两个正整数m和n(m大于等于n)之间最大公约数的:
(1)若m除以n能整除,则最大公约数即为n;
(2)若m除以n不能整除,则用n除以m的余数代替m,再做上述计算,直到m能除尽为止,最后剩下的除数就是此时m和n最大公约数。

举例说明:
求48和24的最大公约数
▲48÷24=2→24÷8=3→8÷2=4→2=2
从上面的运算可以看到最终剩下的除数就是2,因此48和24的最大公约数就是2。

2.更相减损术:
更相减损术也是求最大公约数的数学算法,它要求两个正整数的最大公约数的步骤是:
(1)若m大于等于n,则令m=m-n;
(3)重复上述步骤,直到m等于n为止,最终剩下的数就是m和n最大公约数。

(1)比较两个数m和n的奇偶性(也可称为最低有效位),若m为奇数且n为偶数,则m右移一位;若n为奇数且m为偶数,则n右移一位;若两个数都为奇数或者偶数,则
继续运算。

python函数求两个数的最大公约数和最小公倍数

python函数求两个数的最大公约数和最小公倍数

python函数求两个数的最⼤公约数和最⼩公倍数 1. 求最⼩公倍数的算法:最⼩公倍数 = 两个整数的乘积 / 最⼤公约数所以我们⾸先要求出两个整数的最⼤公约数, 求两个数的最⼤公约数思路如下:2. 求最⼤公约数算法:1. 整数A对整数B进⾏取整, 余数⽤整数C来表⽰举例: C = A % B2. 如果C等于0,则B就是整数A和整数B的最⼤公约数3. 如果C不等于0, 将B赋值给A, 将C赋值给B ,然后进⾏ 1、2 两步,直到余数为0, 则可以得知最⼤公约数程序代码实现如下:1def fun(num1, num2): # 定义⼀个函数, 两个形参2if num1 < num2: # 判读两个整数的⼤⼩,⽬的为了将⼤的数作为除数,⼩的作为被除数3 num1, num2 = num2, num1 # 如果if条件满⾜,则进⾏值的交换45 vari1 = num1 * num2 # 计算出两个整数的乘积,⽅便后⾯计算最⼩公倍数6 vari2 = num1 % num2 # 对2个整数进⾏取余数78while vari2 != 0: # 判断余数是否为0, 如果不为0,则进⼊循环9 num1 = num2 # 重新进⾏赋值,进⾏下次计算10 num2 = vari211 vari2 = num1 % num2 # 对重新赋值后的两个整数取余数1213# 直到 vari2 等于0,得到最到公约数就退出循环1415 vari1 /= num2 # 得出最⼩公倍数16print("最⼤公约数为:%d" % num2) # 输出17print("最⼩公倍数为:%d" % vari1) # 输出181920 fun(6, 9)21#最⼤公约数为:322#最⼩公倍数为:18。

扩展欧几里得算法 python

扩展欧几里得算法 python

扩展欧几里得算法是一种用于求解整数方程ax + by = gcd(a, b)的算法,其中a、b为给定的整数,gcd(a, b)表示a和b的最大公约数。

在python中,我们可以通过编写函数来实现扩展欧几里得算法,为了更深入地理解这个算法,我们先从最基本的欧几里得算法开始。

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

其基本思想是通过反复用较小数去除较大数,直到余数为0为止。

我们可以用以下的python代码来实现欧几里得算法:```pythondef gcd(a, b):while b:a, b = b, a % breturn a```在这段代码中,我们使用了while循环来反复计算a和b的余数,直到余数为0为止。

这样就可以得到a和b的最大公约数。

2. 扩展欧几里得算法在了解了欧几里得算法之后,我们再来看看扩展欧几里得算法。

扩展欧几里得算法不仅可以求出最大公约数,还可以求出满足整数方程ax+ by = gcd(a, b)的整数解x和y。

下面是我们可以用python来实现扩展欧几里得算法的代码:```pythondef extended_gcd(a, b):if b == 0:return 1, 0, aelse:x, y, g = extended_gcd(b, a % b)return y, x - (a // b) * y, g```在这段代码中,我们使用递归的方法来求解扩展欧几里得算法。

当b 等于0时,我们直接返回1, 0, a,即x=1, y=0, 最大公约数为a。

当b 不等于0时,我们继续递归求解,直到b等于0为止。

3. 求解整数方程利用上面给出的扩展欧几里得算法,我们可以很方便地求解整数方程ax + by = gcd(a, b)的整数解x和y。

下面是一个求解整数方程的例子:假设我们要求解整数方程21x + 14y = gcd(21, 14),可以使用以下的python代码来求解:```pythonx, y, g = extended_gcd(21, 14)print("x =", x, " y =", y, " gcd =", g)```在这个例子中,我们调用了extended_gcd函数,并输出了得到的整数解x和y,以及最大公约数g。

25和57的最大公因数

25和57的最大公因数

如何求25和57的最大公因数最大公因数(GCD-Greatest Common Divisor)是两个或多个整数的最大公约数,即能同时整除这些整数的最大正整数。

要找到25和57的最大公因数,可以使用欧几里得算法(辗转相除法)。

首先,用57除以25,得到商2余7。

然后,用25除以7,得到商3余4。

接下来,用7除以4,得到商1余3。

最后,用4除以3,得到商1余1。

因为余数是1,所以1就是25和57的最大公因数。

因此,25和57的最大公因数是1。

附Python编程程序:(1)辗转相除法:import randomdef gcd(a, b):while b != 0:a, b = b, a % breturn adata1 = int(input('输入第一个数: '))data2 = int(input('输入第二个数: '))print('最大公约数为:', gcd(data1, data2))这种方法通过不断地把大数除以小数,直到两数相等为止,最后一次的除数即为最大公约数。

(2)暴力枚举法def gcd(a, b):if a == 0:return bif b == 0:return afor i in range(min(a, b), 0, -1):if a % i == 0 and b % i == 0:return ireturn 1data1 = int(input('输入第一个数: '))data2 = int(input('输入第二个数: '))print('最大公约数为:', gcd(data1, data2))(3)暴力枚举法这种方法通过枚举从小到大的所有可能的约数,并判断是否同时是两数的约数,从而找出最大公约数。

math 库的gcd 函数import mathdef gcd(a, b):return math.gcd(a, b)data1 = int(input('输入第一个数: '))data2 = int(input('输入第二个数: '))print('最大公约数为:', gcd(data1, data2))math 库的gcd 函数Python 的math 库提供了gcd 函数,可以直接调用求最大公约数。

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

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

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

python辗转相除法

python辗转相除法

python辗转相除法Python辗转相除法是一种求最大公约数的有效算法,它可以在短时间内计算出给定数字的最大公约数。

这种算法非常适合在计算机程序中使用,因为它可以很容易地转化为代码,并且效率非常高。

在这篇文章中,我们将介绍Python辗转相除法的步骤,以便读者能够更深入地了解它。

第一步:辗转相除法的概念在开始介绍Python辗转相除法的步骤之前,我们首先需要了解辗转相除法的概念。

它是一种用于求取两个数的最大公约数的算法,这个算法的核心思想是,每次用较大的数去除以较小的数,然后用余数再去除以较小数,直到余数为零,此时另一个数即为最大公约数。

第二步:Python实现辗转相除法下面,我们将介绍如何在Python中实现辗转相除法。

我们可以通过定义一个函数来完成这个任务,这个函数需要有两个参数:a和b,表示需要求取最大公约数的两个数。

函数返回的结果即为它们的最大公约数。

下面是代码实现:```pythondef gcd(a, b):if b == 0:return aelse:return gcd(b, a % b)```在这段代码中,我们首先判断b是否为0,如果是,则直接返回a。

否则,我们调用递归,将a % b作为新的a, b作为新的b进行下一次的运算。

第三步:辗转相除法的运行过程现在,我们来看看辗转相除法是如何运行的。

以求取24和60的最大公约数为例,运算过程如下:1.用60除以24,余数为122.用24除以12,余数为03.最大公约数为12从上述过程可以看出,我们需要不停地用较大的数去除以较小的数,直到余数为0,此时另一个数即为最大公约数。

结果:Python辗转相除法是一种快速有效的求取两个数的最大公约数的算法,它在计算机程序中得到了广泛的应用。

通过对辗转相除法的步骤进行分析,我们可以更好地掌握这个算法,并且理解它是如何工作的。

如果您需要在Python程序中求取最大公约数,就可以使用这个简单而有效的辗转相除法。

辗转相除法求最大公约数和最小公倍数python

辗转相除法求最大公约数和最小公倍数python

辗转相除法求最大公约数和最小公倍数python辗转相除法是一种求解最大公约数和最小公倍数的常见算法,也被称为欧几里得算法。

它的基本思想是利用两个数的余数来反复进行相除,直到余数为0,此时被除数即为最大公约数,而最小公倍数可以通过两数之积除以最大公约数得到。

下面我们来看一下如何在Python中实现辗转相除法。

首先,我们定义一个函数euclidean_algorithm(num1, num2),其中num1和num2为待求解的两个数。

代码如下:```def euclidean_algorithm(num1, num2):if num1 < num2:num1, num2 = num2, num1 # 保证num1 >= num2while num2 != 0:temp = num1 % num2num1 = num2num2 = tempreturn num1```在这个函数中,我们首先比较num1和num2的大小,如果num1小于num2,则交换两个数的值,保证num1大于等于num2。

然后,我们利用while循环来不断进行相除操作,直到余数为0为止。

每次相除操作的余数通过求模运算得到,并用temp来保存,然后更新num1和num2的值。

最后,函数返回num1就是最大公约数。

接下来,我们可以根据最大公约数求出最小公倍数,代码如下:在这个函数中,我们先调用euclidean_algorithm函数求出num1和num2的最大公约数,并将结果存储在gcd变量中。

然后,我们可以通过两个数的积除以最大公约数来计算最小公倍数。

最后,函数返回lcm就是最小公倍数。

我们可以通过调用这两个函数来验证它们的正确性,如下:```print(euclidean_algorithm(48, 36)) # 输出12print(least_common_multiple(48, 36)) # 输出144```运行结果显示,最大公约数是12,最小公倍数是144,符合我们的预期。

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