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

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

#求公约数
import math
temp1=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 L1
for i in common_divisor(a):
    for j in common_divisor(b):
        if i==j:
            sum1+=1
print(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 600
3 200
8 75
24 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)这组数可以验证代码的正确性,但是大多数代码会多解。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值