最大公约数和最小公倍数(详细)
Posted kenny-feng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大公约数和最小公倍数(详细)相关的知识,希望对你有一定的参考价值。
在写“更相减损法”的完整框架时,有一个细节问题要注意:自定义函数返回的结果,要在主函数中将其结果赋值给一个变量,以便后续代码所用,否则即便调用了该函数,也得不到该函数执行的结果。因为返回的结果是局部变量,不能跨函数使用。要在用完自定义函数的那一刻,及时地将结果赋值给一个变量
前言:
约数和倍数:存在于有整除关系的两个整数之间。即若a能整除b,也即a%b=0(余数),则a为b的倍数,b为a的约数(大的为倍数,小的为约数。倍数大于等于约数)。如:12÷3=4…0,则12为3的倍数,3为12的约数
公约数:几个整数的公共约数
最大公约数:Greatest Common Divisor (GCD) 指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的最小公倍数记为[a,b]
实例1:12和16
∵ 12的约数有1、2、3、4、6、12,而16的约数为1、2、4、8、16。(一个整数的约数是有限的)
∴公约数:1、2、4
∴最大公约数:4
记为(12,16)=4或记为(16,12)=4
最小公倍数:Least Common Multiple (LCM)两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。整数a,b的最小公倍数记为[a,b],同样的,a,b,c的最小公倍数记为[a,b,c],多个整数的最小公倍数也有同样的记号
实例2:12和16
12的倍数有12、24、36、48、60、72、84、96、108......,而16的倍数有16、32、48、64、80、96、112......,(一个整数的倍数有无限个
∴公倍数有48、96......
∴最小公倍数:48
记为 [ 12,16 ] =48或 [ 16,12 ] =48
最大公约数的求法:
(1)质因数分解法(所有因素全为质数)
(2)辗转相除法:(欧几里得算法)
编程思路:a÷b=c...d(其中a>b),若d为0,则b就为最大公约数,否则,用b去除d,此时b为被除数,d为除数,而在程序中,由始至终,符号a永远代表被除数,b代表除数,c代表商,d代表余数,所以b要当被除数,就要变为a,即a = b ,而d要当除数,就要变为b,即b = d
1 def gcd(a,b): #定义求最大公约数的函数 2 3 if a < b: 4 5 a,b = b,a 6 7 r = 1 #只要初始值不为0即可 8 9 while r != 0: 10 11 r = a % b 12 13 a = b 14 15 b = r 16 17 return a 18 19 20 21 def lmg(a,b): #定义求最小公倍数的函数 22 23 return a*b//gcd(a,b) 24 25 26 27 def main(): 28 29 a = eval(input()) 30 31 b = eval(input()) 32 33 print("最大公约数:",gcd(a,b)) 34 35 print("最小公倍数:",lcm(a,b)) 36 37 main()
上述代码不用主函数也行(即去掉def main()和main()这两句),并不是去掉后只执行第一个自定义函数。但为了严谨完整、思路清晰,建议放进主函数中
(3)更相减损法:
Notes:辗转相除法求最大公约数效率最高
最小公倍数的求法:
方法一:看上述(1)
方法二:看上述(2),先求除最大公约数,通过(a,b)×[a,b]=a×b求最大公约数(公式法)
Notes:公式法求最小公倍数效率最高
1 a = eval(input()) 2 3 b = eval(input()) 4 5 if a<b: 6 7 a,b = b,a 8 9 #保证a不小于b 10 11 12 count = 0 13 14 if a%2 == 0 and b%2 ==0: #a和b全为偶数时,执行下面代码 15 16 while a%2 == 0 and b%2 ==0: #如果全为偶数,用2不断去除a和b,直到不全为偶数即可(但不一定互质,如11和77) 17 18 a = int(a/2) #除法运算返回float型,需转为int 19 20 b = int(b/2) 21 22 count+=1 #统计除了多少次2 23 24 while a-b != b: #切记:在整个程序中,a永远表示被减数,b为减数,a-b为差。且必须保证a不小于b,下面的if语句就实现了此功能 25 26 a,b = b,a-b #将每次循环计算得到的减数和差赋值成被减数和减数,以便下次计算 27 28 if a<b: 29 30 a,b = b,a 31 32 print(b*2**count) #用最终得到的减数和2的count次方相乘 33 34 35 else: #a和b是否全为偶数时,执行下面代码 36 37 while a-b != b: 38 39 a,b = b,a-b 40 41 if a<b: 42 43 a,b = b,a 44 45 print(b)
完整框架(函数封装):
1 def abc(a,b): 2 if a<b: 3 a,b = b,a 4 while a-b != b: 5 a,b = b,a-b 6 if a<b: 7 a,b = b,a 8 return b 9 10 def main(): 11 a = eval(input()) 12 b = eval(input()) 13 count = 0 14 if a%2 == 0 and b%2 ==0: 15 while a%2 == 0 and b%2 ==0: 16 a = int(a/2) 17 b = int(b/2) 18 count+=1 19 b = abc(a,b) 20 print("最大公约数:",b*2**count) 21 else: 22 b = abc(a,b) 23 print("最大公约数:",b) 24 main()
切记:在主函数中,函数abc()的结果要赋值给一个变量,否则即便return b ,后续代码也用不了这个b,而是用原来的b
以上是关于最大公约数和最小公倍数(详细)的主要内容,如果未能解决你的问题,请参考以下文章