标签:问题 mic image 变量 col 主函数 print input 欧几里得
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