基于python语言:已知最大公约数与最小公倍数,反求符合条件的两个数

来源:互联网 发布:网络平台运营成本预算 编辑:程序博客网 时间:2024/06/05 11:39

上一篇写了辗转相除法求的两个数的最大公约数与最小公倍数,现在想逆向算法,已知最大公约数与最小公倍数,求得符合条件的两个数。
其实这个有很多陷阱,刚开始觉得对了,后来看到一个反例,知道自己错了。所以优化了一下。
先简单化,求出两个数的公约数的个数:

#求公约数import mathtemp1=input('input one positive integer:')temp2=input('input other positive integer:')a=int(temp1)b=int(temp2)sum1=0#求一个数的所有约数的函数def common_divisor(n):    L1=[]    for i in range(1,n+1):        if(n%i==0):            L1.append(i)    return L1for i in common_divisor(a):    for j in common_divisor(b):        if i==j:            sum1+=1print(sum1)

给你两个数a和b,计算出它们分别是哪两个数的最大公约数和最小公倍数。
输出这两个数,小的在前,大的在后,以空格隔开。若有多组解,全部输出。

import math#求两个数的最大公约数的函数def gcd(a,b):    if (a%b==0):        return b    return gcd(b,a%b)def fun_ab(a,b):    for i in range(1,int(math.sqrt(a*b))+1):        if(b%i==0)and(i%a==0):            if gcd(i,a*b//i)==a:#验证在约数里面满足最大公约数的解                print(i,a*b//i)##            fun_ab(1,600)1 6003 2008 7524 25然后求两个数和最小的那一组解:#求多个解中和最小的import math gcd(a,b):    if (a%b==0):        return b    return gcd(b,a%b)def fun_ab(a,b):    j=0    for i in range(1,int(math.sqrt(a*b))+1):        if(b%i==0)and(i%a==0):            if gcd(i,a*b//i)==a:                j=i    print(j,a*b//j)         fun_ab(1,600)##24 25

利用(1,600)这组数可以验证代码的正确性,但是大多数代码会多解。

0 0
原创粉丝点击