python之逆解最大公约数与最小公倍数

1.贴题

题目来自PythonTip
逆解最大公约数与最小公倍数


我们经常遇到的问题是给你两个数,要你求最大公约数和最小公倍数。今天我们反其道而行之,给你两个数a和b,计算出它们分别是哪两个数的最大公约数和最小公倍数。输出这两个数,小的在前,大的在后,以空格隔开。若有多组解,输出它们之和最小的那组。注:所给数据都有解,不用考虑无解的情况。

例如:a=3, b = 60

则输出:12 15


2.说明

一开始想要暴力破解,后来发现暴力破解也不是很简单,所以就投机取巧想着利用现成的函数。

3.参考代码

python3版本

import math #导入math库以便使用最大公约数函数gcd
c = min(a,b) #取ab中小的数即为最大公约数
d = max(a,b) #取ab中大的数即为最小公倍数
flag = False #预先将flag置为False
for i in range(c,d+1): #外层循环i
    for j in range(c,d+1): #内层循环j
        if math.gcd(i,j) == c and i*j/c==d and j%i != 0: #如果ij的最大公约数为c且最小公倍数为d且ij互质
            print(i,j) #则说明找到了将其打印
            flag = True #将flag置为True
            break #跳出内层循环
    if flag: #检验flag,假继续循环,真跳出外层循环
        break

python2版本

from fractions import gcd
c = min(a,b)
d = max(a,b)
flag = False
for i in range(c,d+1):
    for j in range(c,d+1):
        if gcd(i,j) == c and i*j/c==d and j%i != 0:
            print i,j
            flag = True
            break
    if flag:
        break

4.优化代码

虽然上面的代码通过了平台的测试,但是看了人家的代码之后发现上面的代码还是有问题的。因此结合人家的思路修改优化了代码。

import math
c = min(a,b)
d = max(a,b)
l = [] #增加一个列表l用于存放所有满足条件的数组
for i in range(c,d+1):
    for j in range(c,d+1):
        if math.gcd(i,j) == c and i*j/c==d: #删去互质条件因为两数不需要互质
            l.append((i,j)) #如果满足条件,将两数打包为tuple添加到l列表
l.sort(key = lambda x:x[0]+x[1]) #使用两数之和作为key对l中的元素进行排序,默认为升序因此排序后第一组数据为所求的
print(" ".join(map(str,l[0]))) #将第一组数据以空格连接输出

5.其他写法

聚焦不同因数项法 来自blueauris(python2写法)

import math
def gcd(p,q):
    p,q = (p,q) if (p > q) else(q,p)
    while(p%q!=0):
        p,q = q,p%q
    return q

a,b = (a,b) if a<b else (b,a)
diff=b/a
uper = int(math.sqrt(diff)) +1
XYList=[(i,diff/i) for i in range(uper, 0,-1) if diff%i ==0] #求所有因数
XYList =[i for i in XYList if gcd(i[0],i[1])==1]#去除非互质项
XYList.sort(cmp = lambda it1,it2:(it1[0]+it1[1])<(it2[0]+it2[1]) ) #排序,使第一项和最小
x,y=XYList[0]
x,y = (x*a,y*a) if x<y else(y*a,x*a)
print x,y

6.总结

拓展知识
因为数学知识不太扎实,还特意去百度查了一下最大公约数和最小公倍数的关系。
前面的解题文章python之最小公倍数 中已经提到
最小公倍数 = 两数乘积/最大公约数

而作业帮的这个解答知道二个数的最小公倍数和最大公约数怎么求这二个数 讲得更深刻一些

知道最大公约数,说明这两数都是最大公约数的倍数,而且全部公有质因数提取出来连乘,所得的积就是这两个数的最大公约数.最小公倍数是全部公有的质因数和独有的质因数乘积.而且这两个数的最大公约数与它们的最小公倍数的乘积等于这两个数的乘积.
以上题为例:设两数分别为x ,y .由于这两数的最大公约数是7,即全部公有的质因数积为7,又最小公倍数为84,则独有的质因数积为84/7=12=4*3.又xy=7*84,则x=28 ,y=21或x=21,y=28

猜你喜欢

转载自blog.csdn.net/weixin_41980474/article/details/80230881