oj 给你两个数a和b,计算出它们分别是哪两个数的最大公约数和最小公倍数
2017-09-22 21:26
375 查看
描述:
我们经常遇到的问题是给你两个数,要你求最大公约数和最小公倍数。今天我们反其道而行之,给你两个数a和b,计算出它们分别是哪两个数的最大公约数和最小公倍数。输出这两个数,小的在前,大的在后,以空格隔开。若有多组解,输出它们之和最小的那组。注:所给数据都有解,不用考虑无解的情况。
例如:a=3, b = 60
则输出:12 15
Python代码:
我们经常遇到的问题是给你两个数,要你求最大公约数和最小公倍数。今天我们反其道而行之,给你两个数a和b,计算出它们分别是哪两个数的最大公约数和最小公倍数。输出这两个数,小的在前,大的在后,以空格隔开。若有多组解,输出它们之和最小的那组。注:所给数据都有解,不用考虑无解的情况。
例如:a=3, b = 60
则输出:12 15
Python代码:
# 最大公约数 def sm(a, b): while True: c = a % b if c == 0: # print(b) return b break else: a = b b = c # 最小公倍数 def lg(a, b): mul = a * b gd = 1 gd = sm(a, b) return mul // gd a = 2 b = 12 # 得到最大公约数是 a, 最小公倍数是 b 的所有可能组合 # 其中,a 存入lis_a列表, b 存入lis_b列表 lis_a = [] lis_b = [] for i in range(b, a - 1, -1): for j in range(b, a - 1, -1): if (i % a == 0 and j % a == 0) and (b % i == 0 and b % j == 0): lis_a.append(i) lis_b.append(j) # 去除重复项 lis_a = set(lis_a) lis_b = set(lis_b) # 将所有满足条件的两个数组合成 key-value的形式,存入字典中 re_lis = {} for i in lis_a: for j in lis_b: if sm(i, j) == a and lg(i, j) == b: re_lis[i] = j # 记录满足条件的两个数中,和最小的一项 # 这里我第一次是用最大数来记录,下面循环如果找到比这个小的,就更新min值,并分别记录两个数 min = max(re_lis) for key, value in re_lis.items(): if min > (key + value): min = (key + value) re_a = key re_b = value # 打印结果 print('%d %d' % (re_a, re_b))
相关文章推荐
- 计算两个数的最大公约数和最小公倍数
- OJ题——求两个数的最大公约数与最小公倍数
- Linux C---函数调用实例:递归调用计算阶乘,求两个数的最大公约数和最小公倍数
- OJ循环——求两个数的最大公约数与最小公倍数(函数法)
- 求两个数的最大公约数和最小公倍数的一种超级简单的方法
- 使用stein 算法计算 最大公约数和最小公倍数
- [Java]练习题006: 求两个数的最大公约数和最小公倍数
- Java学习笔记10:求两个数的最小公倍数和最大公约数
- 求两个数的最大公约数和最小公倍数
- 求两个数的最大公约数和最小公倍数
- C语言求两个数的最大公约数和最小公倍数
- 写两个函数,分别求两个整数的最大公约数和最小公倍数
- 求两个数的最大公约数和最小公倍数
- 百度web前端面试题之求两个数的最大公约数和最小公倍数
- 求两个数的最大公约数和最小公倍数
- [Java]练习题006: 求两个数的最大公约数和最小公倍数
- 用辗转相除法求两个数的最大公约数和最小公倍数(什么是辗转相除法,讲解)(C++语言)
- 求两个数的最大公约数和最小公倍数
- oj第十一周训练——求两个整数的最大公约数和最小公倍数
- 求两个数的最大公约数与最小公倍数