输入两个正整数,求其最大公约数和最小公倍数。
时间: 2023-05-27 09:07:14 浏览: 86
算法1:暴力枚举
```python
def gcd(a, b):
"""求a和b的最大公约数"""
if a < b:
a, b = b, a
for i in range(b, 0, -1):
if a % i == 0 and b % i == 0:
return i
def lcm(a, b):
"""求a和b的最小公倍数"""
return a * b // gcd(a, b)
# 测试
a = int(input("请输入第一个正整数:"))
b = int(input("请输入第二个正整数:"))
print("它们的最大公约数为:", gcd(a, b))
print("它们的最小公倍数为:", lcm(a, b))
```
算法2:辗转相除法
```python
def gcd(a, b):
"""求a和b的最大公约数"""
if a < b:
a, b = b, a
while b != 0:
r = a % b
a = b
b = r
return a
def lcm(a, b):
"""求a和b的最小公倍数"""
return a * b // gcd(a, b)
# 测试
a = int(input("请输入第一个正整数:"))
b = int(input("请输入第二个正整数:"))
print("它们的最大公约数为:", gcd(a, b))
print("它们的最小公倍数为:", lcm(a, b))
```
算法3:更相减损术和位移结合
```python
def gcd(a, b):
"""求a和b的最大公约数"""
if a == b:
return a
if a < b:
a, b = b, a
while b != 0:
if a % 2 == 0 and b % 2 == 0:
a = a >> 1
b = b >> 1
k = k << 1
elif a % 2 == 0 and b % 2 != 0:
a = a >> 1
elif a % 2 != 0 and b % 2 == 0:
b = b >> 1
else:
a = abs(a - b)
b = min(a, b)
return a * k
def lcm(a, b):
"""求a和b的最小公倍数"""
return a * b // gcd(a, b)
# 测试
a = int(input("请输入第一个正整数:"))
b = int(input("请输入第二个正整数:"))
k = 1
print("它们的最大公约数为:", gcd(a, b))
print("它们的最小公倍数为:", lcm(a, b))
```
阅读全文