求一组数的最大公约数

#欧几里德定理求2个数的最大公约数
def gcd(a,b):
    if b==0:
        return a
    else:
        return gcd(b,a%b)

def mgcd(s):
    #两两求最大公约数,会得到1个数组,在这个数组里再两两求公约数,如此递归,最终会得到1个只有1个数的数组,就是最大公约数
    if len(s)==1:
        return s[0]
    elif len(s)==2:
        return gcd(s[0],s[1])
    else:
        cd=[]
        for i in s:
            #不求自己与自己的最大公约数
            if i!=s[0]:
                cd.append(gcd(s[0],i))
        #去除数组中的重复数据
        cd=list(set(cd))
        return mgcd(cd)
        
def greatest_common_divisor(*args):
    """
        Find the greatest common divisor
    """
    #两两求最大公约数,会得到1个数组,在这个数组里再两两求公约数,如此递归,最终会得到1个只有1个数的数组,就是最大公约数
    return mgcd(args)

if __name__ == '__main__':
    #These "asserts" using only for self-checking and not necessary for auto-testing
    assert greatest_common_divisor(6, 4) == 2, "Simple"
    assert greatest_common_divisor(2, 4, 8) == 2, "Three arguments"
    assert greatest_common_divisor(2, 3, 5, 7, 11) == 1, "Prime numbers"
    assert greatest_common_divisor(3, 9, 3, 9) == 3, "Repeating arguments"

在checkio.org遇到的一道题,觉得挺有总结意义的。

你可能感兴趣的:(数组,最大公约数)