Python中最大公约数的代码

Luk*_*e D 103 python

a和b的最大公约数(GCD)是将两者分开而没有余数的最大数.

找到两个数字的GCD的一种方法是Euclid算法,该算法基于以下观察结果:if 是除以之后r的余数.作为基础案例,我们可以使用.abgcd(a, b) = gcd(b, r)gcd(a, 0) = a

写一个函数调用GCD是需要的参数ab返回他们的最大公约数.

use*_*424 287

在标准库中.

>>> from fractions import gcd
>>> gcd(20,8)
4
Run Code Online (Sandbox Code Playgroud)

inspectPython 2.7中模块的源代码:

>>> print inspect.getsource(gcd)
def gcd(a, b):
    """Calculate the Greatest Common Divisor of a and b.

    Unless b==0, the result will have the same sign as b (so that when
    b is divided by it, the result comes out positive).
    """
    while b:
        a, b = b, a%b
    return a
Run Code Online (Sandbox Code Playgroud)

从Python 3.5开始,gcd 就在math模块中 ; 中的一个fractions被弃用了.此外,inspect.getsource不再返回任何一种方法的解释性源代码.

  • 它不返回*"_largest_数字,它们将它们分成没有余数"*例如,`fractions.gcd(1,-1)`是`-1`但是`1> -1`即`1`将"1"和"-1"除以没有余数并且大于"-1",请参阅http://bugs.python.org/issue22477 (3认同)
  • @JFSebastian FWIW,从 Python 3.5 开始,`math.gcd(1, -1)` 返回 `1`。 (2认同)

net*_*tom 39

使用mn的算法运行得非常长.

这个表现得更好:

def gcd(x, y):
    while y != 0:
        (x, y) = (y, x % y)
    return x
Run Code Online (Sandbox Code Playgroud)

  • @netom:不,作业*不能这样写; 元组赋值在赋值之前使用`x`.你首先将`y`分配给'x`**,所以现在`y`将被设置为'0'(因为`y%y`总是为0). (20认同)
  • 该算法如何工作?它就像魔术一样. (10认同)
  • 这也是标准库中的一个. (5认同)
  • @netom:在使用这个答案中的元组赋值时根本不需要. (3认同)
  • @hynekcer:你似乎缺少上下文。我不是在讨论答案,我是在批评 netom 的评论。 (2认同)

小智 19

此版本的代码使用Euclid的算法来查找GCD.

def gcd_recursive(a, b):
    if b == 0:
        return a
    else:
        return gcd_recursive(b, a % b)
Run Code Online (Sandbox Code Playgroud)

  • 您在名称中使用了*iter*,但它实际上是一个递归版本. (28认同)

Jon*_*röm 15

gcd = lambda m,n: m if not n else gcd(n,m%n)
Run Code Online (Sandbox Code Playgroud)


Moh*_*med 10

使用递归

def gcd(a,b):
    return a if not b else gcd(b, a%b)
Run Code Online (Sandbox Code Playgroud)

使用while ,

def gcd(a,b):
  while b:
    a,b = b, a%b
  return a
Run Code Online (Sandbox Code Playgroud)

使用拉姆达,

gcd = lambda a,b : a if not b else gcd(b, a%b)

>>> gcd(10,20)
>>> 10
Run Code Online (Sandbox Code Playgroud)