您的位置:首页 > 编程语言 > Python开发

oj 给你两个数a和b,计算出它们分别是哪两个数的最大公约数和最小公倍数

2017-09-22 21:26 375 查看
描述:

我们经常遇到的问题是给你两个数,要你求最大公约数和最小公倍数。今天我们反其道而行之,给你两个数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))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python oj PythonTip