问题描述
通过欧几里得算法可以求余数,a和b的公约数GCD是两者都可以被除的最大整数,例如gcd(20, 35) = 5 ,gcd(13, 28) = 1。欧几里得算法非常简单 - 我们继续从较大的值中减去(a和b)较小的值 - 并重复此操作直到值变为相等 - 最后一个值将是gcd。 为了加快处理速度,我们可以使用模运算而不是减法运算。例如
20 35 - subtract first from second
20 15 - subtract second from first
5 15 - now subtract first from second twice
5 5 - and here is GCD
和b的最小公倍数(或LCM)是这样的整数d,它可以被它们两者整除(并且是所有可能的中最小的)。 它可以通过以下规则找到:
lcm(a, b) = a * b / gcd(a, b)
输入数据包含第一行中的测试用例数。
然后是包含测试用例的行,每行包含两个数字 - 用于A和B.
答案应包含每对的GCD和LCM,用括号括起并用空格分隔,例如:
input data:
2
2 3
4 10
answer:
(1 6) (2 20)
代码
numInput=int(input())
for i in range(numInput):
line=list(map(int,input().split()))
a=line[0]
b=line[1]
while a != b:
if a>b:
a=a-b
else:
b=b-a
gcd=a
Icm=round(line[0]*line[1]/gcd)
#print("("+str(gcd)+" "+str(Icm)+")",end=" ")
print('({} {})'.format(gcd,Icm),end=" ")
练习了下占位符这个方法是用相减直至相等来求公约数
def gcd_lcm(lst):
a, b = a2, b2 = list(map(int, lst.split()))
while a!=0 and b!=0:
if a > b:
a %= b
else:
b %= a
return '({} {})'.format(a + b, int(a2 * b2 / (a + b)))
print(' '.join(gcd_lcm(input()) for i in range(int(input()))))
通过两数求余,直至一个数为0为止,比较有学习价值