题目描述
最大公约数和最小公倍数
本题目要求读入2个正整数A和B,然后输出它们的最大公约数和最小公倍数。
输入格式:
输入在一行中给出2个不超过10000的正整数A和B。
输出格式:
对每一组输入,在一行中输出最大公约数和最小公倍数,用逗号分隔。
输入样例:
2 3
输出样例:
1,6
解题思路
要求两个数的最大公约数和最小公倍数,可以通过数学中的辗转相除法来实现。
辗转相除法,也称为欧几里德算法,是一种用于计算两个数的最大公约数(GCD)的方法。
该算法基于以下观察:
- 如果 a a a 能整除 b b b ,那么 b b b 就是 a a a 和 b b b 的最大公约数。
- 如果 a a a 不能整除 b b b ,那么 a a a 和 b b b 的最大公约数等于 b b b 和 a % b a\%b a%b( a a a 除以 b b b 的余数)的最大公约数。
最大公约数(Greatest Common Divisor,GCD)
根据这个观察,我们可以使用迭代的方式来逐步计算最大公约数。具体步骤如下:
- 通过取余运算,将
a
和b
替换为b
和a % b
的值。 - 重复上述步骤,直到
b = 0
,此时a
的值就是最大公约数。
辗转相除法的时间复杂度为 O ( l o g ( m a x ( a , b ) ) ) O(log(max(a, b))) O(log(max(a,b))) ,其中 a a a 和 b b b 分别是输入的两个数。这使得它成为求解最大公约数的高效算法。
最小公倍数(Least Common Multiple,LCM)
最小公倍数可以通过最大公约数来计算。最小公倍数等于两个数的乘积除以最大公约数。即:
L C M = ( A × B ) ÷ G C D LCM = (A \times B) \div GCD LCM=(A×B)÷GCD
代码中的交换变量和更新变量
-
a, b = b, a % b
是Python中的一种语法,通常用于交换两个变量的值。
这条语句先计算a % b
的值,并将结果保存在一个临时变量中。然后,它将b
的值赋给a
,将临时变量的值赋给b
,完成了两个变量的值的交换。 -
t = b;b = a % b;a = t
也是辗转相除法的一种实现方式。
这条语句先将b
的值赋给一个临时变量t
,然后将a % b
的值赋给b
,最后将临时变量t
的值赋给a
。
a, b = b, a % b
和 t = b; b = a % b; a = t
这两段代码实际上是等价的,都是用于在辗转相除法中交换变量和更新变量的值。
这两种写法的效果是一样的,都能够正确地交换a
和b
的值,并计算出a
和b
的新值。
使用a, b = b, a % b
这种写法可以简化代码,通过一行语句完成交换和更新操作。而使用t = b; b = a % b; a = t
这种写法则是分开进行三个步骤,更加明确地展示了每个操作的含义和顺序。
无论选择哪种写法,最终都能正确地实现辗转相除法的功能。选择哪种写法主要取决于个人习惯和代码风格的偏好。
Python代码实现
# 计算最大公约数
def gcd(a, b):
while b != 0:
# t = b
# b = a % b
# a = t
a, b = b, a % b
return a
# 计算最小公因数
def lcm(a, b):
return a * b // gcd(a, b)
a, b = map(int, input().split())
g = gcd(a, b)
l = lcm(a, b)
print(f"{g},{l}")