# greatest_common_divisor.py
from typing import Tuple
import math
def gcd_1(m_n: Tuple[int, int]) -> int:
"""
最大公约数:辗转相除法
算法思想:
反复取除数作为被除数,余数作为除数,做除法运算。当余数为 0 时,取当前算式除数为最大公约数。
:param m_n: 包含两个整数的元组
:return: 两个整数的最大公约数
"""
m = max(m_n[0], m_n[1])
n = min(m_n[0], m_n[1])
r = m % n
while r:
m, n = n, r
r = m % n
return n
def gcd_2(m_n: Tuple[int, int]) -> int:
"""
最大公约数:辗转相减法
算法思想:
反复取减数和差值中的最大值作为被减数,最小值为减数,做减法运算。当差值为 0 时,取当前算式减数为最大公约数。
:param m_n: 包含两个整数的元组
:return: 两个整数的最大公约数
"""
m = max(m_n[0], m_n[1])
n = min(m_n[0], m_n[1])
difference = m - n
while difference:
m = max(n, difference)
n = min(n, difference)
difference = m - n
return n
def gcd_3(m_n: Tuple[int, int]) -> int:
"""
最大公约数:蛮力法
算法思想:
(1)取i为两个数的最小值作为除数,分别对两个数取余。若余数都为0,则找到最大公约数返回;否则i-=1继续循环,直到
i = ⌊math.sqrt(min_)⌋+1执行完退出循环为止。
(2)判断i是否等于⌊math.sqrt(min_)⌋+1,等于表明循环结束时并未找到最大公约数,此时最大公约数只能是1
:param m_n:
:return:
"""
m = m_n[0]
n = m_n[1]
min_ = min(m_n[0], m_n[1])
min_sqrt = int(math.sqrt(min_))
for i in range(min_, min_sqrt, -1):
if m % i == 0 and n % i == 0:
# 满足该条件时,两个商值一定互质
return i
if i == min_sqrt + 1:
return 1
if __name__ == '__main__':
m_n = (568, 864)
result = gcd_1(m_n)
print(result)
result = gcd_2(m_n)
print(result)
result = gcd_3(m_n)
print(result)
"""
运算结果:
8
8
8
Process finished with exit code 0
"""
1_python--算法--求最大公约数
最新推荐文章于 2024-03-28 15:55:34 发布