码迷,mamicode.com
首页 > 其他好文 > 详细

最大公约数和最小公倍数(详细)

时间:2019-09-07 01:01:39      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:问题   mic   image   变量   col   主函数   print   input   欧几里得   

在写“更相减损法”的完整框架时,有一个细节问题要注意:自定义函数返回的结果,要在主函数中将其结果赋值给一个变量,以便后续代码所用,否则即便调用了该函数,也得不到该函数执行的结果。因为返回的结果是局部变量,不能跨函数使用。要在用完自定义函数的那一刻,及时地将结果赋值给一个变量
前言:
约数和倍数:存在于有整除关系的两个整数之间。即若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

最大公约数和最小公倍数(详细)

标签:问题   mic   image   变量   col   主函数   print   input   欧几里得   

原文地址:https://www.cnblogs.com/kenny-feng/p/11478925.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!