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链并不是算法。
答案 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