题目是:从键盘接收两个整数,编写程序求出这两个整数的最大公约数和最小公倍数。(提示:求最大公约数可用辗转相除法,求最小公倍数则用两数的积除以最大公约数即可。) 同时还给出了辗转相除法的具体步骤: (1)用一个整数去除另一个整数,得到它们的余数; (2)如果余数为 0,则除数就是最大公约数,结束运算; (3)如果余数不为 0,则计算除数和余数的最大公约数即可(舍去被除数); (4)重新转向(1)。 并通过举例“设 a = 48, b = 18, a % b = 12,余数不为 0。取 a = 18, b = 12, a % b = 6,余数不为 0。取 a = 12, b = 6, a % b = 0,余数为 0。则最大公约数为 6,结束运算”对辗转相除法进行了说明。用Python
时间: 2025-06-24 07:45:06 浏览: 8
### Python 实现辗转相除法求最大公约数和最小公倍数
#### 最大公约数的实现
通过辗转相除法,可以高效地找到两个整数的最大公约数。该算法的核心思想是不断用较大的数对较小的数取模,直至余数为零,此时最后一个非零余数即为所求数字的最大公约数。
以下是基于迭代方式实现的代码:
```python
def gcd_iterative(a, b):
"""
使用迭代方法实现辗转相除法求最大公约数
:param a: 第一个整数
:param b: 第二个整数
:return: 两个整数的最大公约数
"""
while b != 0:
a, b = b, a % b
return a
```
如果希望采用递归的方式来实现同样的功能,也可以按照以下方式进行编码:
```python
def gcd_recursive(a, b):
"""
使用递归方法实现辗转相除法求最大公约数
:param a: 第一个整数
:param b: 第二个整数
:return: 两个整数的最大公约数
"""
if b == 0:
return a
else:
return gcd_recursive(b, a % b)
```
无论是迭代还是递归版本,都可以得到相同的结果[^1]。
---
#### 最小公倍数的实现
一旦得到了两个整数的最大公约数 \( \text{gcd}(a, b) \),可以通过以下公式快速计算出它们的最小公倍数:
\[
\text{lcm}(a, b) = \frac{|a \times b|}{\text{gcd}(a, b)}
\]
注意,在实际编程中应确保分母不为零,并且为了防止溢出,通常先进行除法运算后再做乘法操作。下面是完整的函数定义:
```python
def lcm(a, b):
"""
计算两个整数的最小公倍数
:param a: 第一个整数
:param b: 第二个整数
:return: 两个整数的最小公倍数
"""
return abs(a * b) // gcd_iterative(a, b)
```
这里调用了之前编写的 `gcd_iterative` 函数作为辅助工具[^2]。
---
#### 完整示例程序
下面提供了一个综合性的例子,允许用户输入任意两个正整数并返回其最大公约数与最小公倍数:
```python
def main():
try:
num1 = int(input("请输入第一个正整数:"))
num2 = int(input("请输入第二个正整数:"))
if num1 <= 0 or num2 <= 0:
raise ValueError("输入必须为正整数")
greatest_common_divisor = gcd_iterative(num1, num2)
least_common_multiple = lcm(num1, num2)
print(f"{num1} 和 {num2} 的最大公约数为:{greatest_common_divisor}")
print(f"{num1} 和 {num2} 的最小公倍数为:{least_common_multiple}")
except Exception as e:
print(f"发生错误:{e}")
if __name__ == "__main__":
main()
```
此脚本会提示用户分别键入两个数值,随后打印对应的 GCD(Greatest Common Divisor)以及 LCM(Least Common Multiple)。它还包含了基本异常处理逻辑以应对非法输入情况[^3]。
---
阅读全文
相关推荐















