大家好,给大家分享一下python计算两个数的最大公约数和最小公倍数,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!
大家好,小编来为大家解答以下问题,python最大公约数最小公倍数,python求公约数和公倍数,现在让我们一起来看看吧!
题目:求取任意两个非负数(至多一个数为0)的最大公约数和最小公倍数;
参考资料:Python解决求最大公约数和最小公倍数问题 link;最小公约数(欧几里得算法&stein算法) link
1.穷举法
两个非负数(至多一个数为0)的存在情况:其中一个数为0;两个数均为正数。当两个数中有一个数为0时,最大公约数为另一个非零数;当两个均为正数时,选择较小的正数(两个数的最大公约数肯定小于或等于较小的数),从大到小进行列举,得到的公约数即为最大公约数学python哪本书好学python有用吗。
最小公倍数=两数乘积/最大公约数
实现代码如下:
// An highlighted block
#输入参数
#最大公约数
def gcd_exhaus(a,b):
if a==0 and b==0:
print("请重新输入参数")
#break
elif min(a,b)==0:
return max(a,b)
elif a==b:
return a
else:
a,b=max(a,b),min(a,b)
for i in range(b,0,-1): #从大到小列举
if a%i==0 and b%i==0:
return i
break
else:
continue
gcd_exhaus(8,4)
#最小公倍数
def lcm_exhaus(a,b):
return a*b/gcd_exhaus(a,b)
lcm_exhaus(8,4)
2.欧几里德法
欧几里德法也称辗转相除法,假设有两个整数a、b,且满足条件a>b,若a%b不为0,则对a、b求最大公约数等价于对b、(a%b)求最大公约数。依此类推,直至两数可以整除。
实现代码如下:
// An highlighted block
#最大公约数
def gcd_euclid(a,b):
if a==0 and b==0:
print("请重新输入参数")
#break
elif min(a,b)==0:
return max(a,b)
else:
a,b=max(a,b),min(a,b)
if a%b==0:
return b
else:
return gcd_euclid(b,a%b)
gcd_euclid(12,3)
#最小公倍数
def lcm_euclid(a,b):
return a*b/gcd_euclid(a,b)
lcm_euclid(12,3)
3.Stein算法
欧几里德算法是计算两个数最大公约数的传统算法,无论从理论还是从实际效率上都是很好的。但当出现大素数时,欧几里德法则存在较大的缺陷。
Stein算法:
假设 A 1 = A , B 1 = B , C 1 = 1 A_1=A,B_1=B,C_1=1 A1=A,B1=B,C1=1:
for n = 1 , 2 , 3 , . . . n=1,2,3,...