Python 判断公约数、公倍数

一、判断最大公约数:

我想到的:

def max(x,y):
    if x > y :
        small = y
    else:
        small = x
    for i in range(small,1,-1):
    # for i in range(1,small + 1):
        print("Inter i word", i)
        if x % i == 0 and y % i == 0:
            print("Max",i)
            break (正循环的时候,此行注掉)

一开始我想到的是我注释的那一行,就是正取值,举例:12和24,结果为循环的最后一次的值:12,我想循环这么多次,在开发中,浪费太大,我反过来循环取值,

第一次不就取到了,就是现在运行的。后来又想到一对数值:24,39,这种情况下,正循环比反循环循环次数更少。所以想是否有更好的方法。

稍微好一些的方法

def max1(a, b) :
    c = 0
    while (a != b) :
        c +=1
        if (a > b):
            a = a - b
        else:
            b = b - a
    print('1 cycle times',c)
    return b

我搜到的:辗转相除法,循环次数少

def max2(a, b) :
c=0
while (a % b != 0) :
c +=1
if (a > b):
a,b=b,a%b
else:
a,b=a,a%b
print("b =",b)
print('2 cycle times', c)
return b

 欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数

二、判断公倍数

def MinNum(x,y):
    m = max(x,y)
    while True:
        if (m % x == 0) and (m % y == 0):
            MinNum = m
            break
     m += 1
    return MinNum

这是我一开始想到的,感觉要是数字过大,循环次数过多,又想到辗转相除法的到最大公约数,得到下面方法:

def gbs(x,y):
    m = max(x,y)
    n = min(x,y)
    while m % n :
        m,n = n,m%n
    return (x // n) * (y // n) * n

 

posted on 2021-03-03 15:50  如尘如水  阅读(941)  评论(0编辑  收藏  举报