python实现求两个数最大公约数和最小公倍数
最大公约数
方法(一)
最大公约数(最大公因数)就是几个数公有的因数中最大的一个。
例:12与18 12的因数有1,12,2,6,3,4
18的因数有1,18,2,9,6,3
公有的因数有1,2,3,6, 所以6就是12与18的最大公约数.
而求最大公约数的方法可以总结为:
1)更相减损法:更相减损术, 出自于中国古代的《九章算术》,也是一种求最大公约数的算法。
①先判断两个数的大小,如果两数相等,则这个数本身就 是就是它的最大公约数。
②如果不相等,则用大数减去小数,然后用这个较小数与它们相减的结果相比较,如果相等,则这个差就是它们的最大公约数,而如果不相等,则继续执行②操作。
python代码实现如下
def calMaxCommonDivisor(a,b):
"""
5-15.
最大公约数和最小公倍数。请计算两个整型的最大公约数和最小公倍数。
:return:最大公约数和最小公倍数(用更相减损法求最大公约数)
"""
while(1):
if(a > b):
a = a-b
elif(a < b):
b = b -a
else:
return a
if __name__ == '__main__':
print(calMaxCommonDivisor(10,75))
方法(二)
第二种方法(用辗转相除法求最大公约数):
辗转相除法, 又名欧几里得算法(Euclidean algorithm),目的是求出两个正整数的最大公约数。它是已知最古老的算法, 其可追溯至公元前300年前。
这条算法基于一个定理:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。比如10和25,25除以10商2余5,那么10和25的最大公约数,等同于10和5的最大公约数。
2)辗转相除法解法分析:
①当两个数相等时,其中任意一个就是它们的最大公约数,因为它们的余数为0;
②当两个数不相等时,用较大数除以较小数,当余数不为0时,这时
使较小数作为被除数,余数作为除数,继续 ②的操作,直至余数为0,那么大的那个数为最大公约数;这两个数相等时,其中任一数为最大公约数。
def maxCommonDivison(a,b):
"""
用辗转相除法求最大公约数
:return:
"""
while(a*b != 0):
if(a > b):
a = a % b
elif(a < b):
b = b % a
else:
return a
return max(a,b)
if __name__ == '__main__':
print(maxCommonDivison(25,100))
方法(三)
第三种方法:使用递归(结合辗转相除法和更相减损法的优势以及移位运算)
众所周知,移位运算的性能非常快。对于给定的正整数a和b,不难得到如下的结论。其中gcb(a,b)的意思是求a,b的最大公约数的函数
当a和b均为偶数,gcb(a,b) = 2*gcb(a/2, b/2) = 2*gcb(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的结果必然是偶数,又可以继续进行移位运算。
比如计算10和25的最大公约数的步骤如下:
(10,25)———(10>>1,25 )————-( 5,25)
(5,25 )———-(5,25-5 )————(5,20)
(利用更相减损法)
(5,20)———-(5,20>>1 )———– (5,10)
(5, 10)———-(5,10>>1 )———– (5,5)
(5,5)———–(5,5-5)———(5,0)——-5为最大公约数
def gcd(a,b):
"""
使用递归(结合辗转相除法和更相减损法的优势以及移位运算)求最大公约数 性能最好
:return:
"""
if (a == b):
return a
if (a == 0 | b == 0):
return a + b
if (a == 1 | b == 1):
return 1
if (a < b):
gcd(b, a)
else:
# 两个数都是偶数
if((a &1) == 0 and (b &1) == 0 ) :
return gcd(a >> 1, b >> 1)<<1
# a为偶数 b为奇数
elif((a &1) == 0 and (b &1)== 1):
return gcd(a >>1,b)
# a为奇数,b为偶数
elif((a &1) == 1 and (b &1)== 0):
return gcd(a, b >>1)
else:
#两个数都是奇数
return gcd(b, a-b)
第三种方法python实现有点问题,待解决后更新
最小公倍数:
def leastCommultiple(a,b):
"""
最小公倍数就是几个数公有的倍数中最小的一个。
6的倍数有6,12,18,24,……
4和6 公倍数 12,18……, 所以4和6的最小公倍数是12 。
如果求a和b的最小公倍数,可以先求出它们的最大公约数,最小公倍数就是 a*b/最大公约数
:return:
"""
mcd = maxCommonDivison(a,b)
lcm = (a*b)/mcd
return lcm
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构