python中的欧几里德算法(减法)

时间:2016-07-24 18:39:35

标签: python algorithm subtraction greatest-common-divisor

In"伟大的数学问题 - 无限的视野",第18页Ian Stewart提到欧几里德的命题2,元素的第七册,这是找到最大公约数的一种非常基本的方法。我引用"它的工作原理是重复从较大的数字中减去较小的数字,然后对得到的余数和较小的数字应用类似的过程,并继续直到没有余数。"例子是630和135. 135被删除"从630(495,360,225)减去"最后得到90,小于135.所以数字被反转,并且从135重复减去90最后得到45.然后从90减去45并最终得到0得到45 gcd。这有时被称为寻找gcd的欧几里德算法。

教一个初学者(10岁的孩子)我需要在python中编写代码。不应该有任何函数定义,也不应该使用除减法之外的任何其他数学运算。我想使用if / while / else / elif / continue / break。应该规定,如果给出三个数字(或更多),则必须重复整个程序来决定较小的数字。 从这个角度看,早期的gcd链并不是算法。

1 个答案:

答案 0 :(得分:0)

gcd算法的典型快速解决方案是像这样的迭代版本:

def gcd(x, y):
    while y != 0:
        (x, y) = (y, x % y)

    return x

事实上,在python中你只需直接使用分数模块提供的gcd函数。

如果你想要这样的函数来处理多个值,你只需要使用reduce:

reduce(gcd,your_array)

现在,似乎你想限制自己只使用循环+子代,所以一个可能的解决方案来处理x,y正整数将是这样的:

def gcd_unopt(x, y):
    print x,y

    while x!=y:
        while x>y:
            x -= y
            print x,y
        while y>x:
            y -= x
            print x,y

    return x

print reduce(gcd_unopt,[630,135])

不确定为什么要避免使用函数,gcd是一个定义的函数,即便如此,这很简单,只需删除函数声明并将参数用作全局变量,例如:

x = 630
y = 135

print x,y

while x!=y:
    while x>y:
        x -= y
        print x,y
    while y>x:
        y -= x
        print x,y