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

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

2017-04-24 22:43 826 查看
上一篇写了辗转相除法求的两个数的最大公约数与最小公倍数,现在想逆向算法,已知最大公约数与最小公倍数,求得符合条件的两个数。

其实这个有很多陷阱,刚开始觉得对了,后来看到一个反例,知道自己错了。所以优化了一下。

先简单化,求出两个数的公约数的个数:

#求公约数
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)这组数可以验证代码的正确性,但是大多数代码会多解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 python