Python求最大公约数与最小公倍数的方法

最大公约数:
对于最大公约数求解,个人最喜欢辗转相除法和辗转相减法
1,辗转相除法:想对传入的两个数进行排序,大的数对小的数取余,什么时候取余为0,什么时候返回小的那个数即可。具体写法如下:

def biggest_common_divisor(x: int, y: int) -> int: 
    '''Compute the greatest common divisor of two numbers'''
    m,n = sorted([x,y],reverse=True) # m是大的,n是小的。辗转相除法
    while m % n:
        r = m % n
        m = n
        n = r
    return n
print(reduce(biggest_common_divisor,[6,12,32,80])) # 可判断一组内元素的最大公约数

2,辗转相减法:在两个数不相等的前提下,循环比较两个数的大小,使用大的数减去小的数并赋值给大的,直到两个数相等。

def biggest_common_divisor2(x: int, y: int) -> int: 
    '''Compute the greatest common divisor of two numbers'''
    while x != y:
        if x > y:
            x -= y
        else:
            y -= x
    return x # return x也一样

最小公倍数:
对于最小公倍数求解,个人习惯先求出最大公约数,再根据求出的最大公约数来计算最小公倍数
举例:
5和33的最大公约数是1,最小公倍数是533/1 = 165
32和80的最大公约数是16,最小公倍数是32
80/16 = 160
公式:a和b的最小公倍数 = a * b / (a和b的最大公约数)

def lowest_common_multiple(x: int, y: int) -> int:
	'''Compute the least common multiple of two numbers'''
    return x*y//biggest_common_divisor(x,y)
print(reduce(lowest_common_multiple,[6,12,32]))

枚举法:较为麻烦
使用两个数之中,较大的数作为起始,判断是否满足同时整除x和y,不满足则进行加一操作。

def lowest_common_multiple2(x: int, y: int) -> int:
    x,y = sorted([x,y],reverse=True)
    target = x
    while True:
        if target % x == 0 and target % y == 0:
            return target
        else:
            target += 1

你可能感兴趣的:(Python基础,python)