【问题标题】:python finding the greatest common divisor of two numbers programpython找到两个数字的最大公约数程序
【发布时间】:2020-04-11 06:35:52
【问题描述】:

我是一名 Python 新手。我试图找到两个数字的最大公约数(例如 a = 1071 和 b = 462)。我为此编写了两个程序。第一个正在工作,但第二个给出了错误的答案。我的程序有什么问题??

# first program (works)
a, b = 1071, 462
while b:
    a, b = b, a % b
print(a)

# second program (doesn't work truly)
a = 1071
b = 462
while b:
    a = b
    b = a % b
print(a)

【问题讨论】:

  • a 的值在评估 b = a % b 时更改为 b。你只是在运行b = b % b
  • 是的,在第二种情况下,您已将 a 的值更改为 b,因此 b 的估值是错误的。您最好将其存储在其他变量中,然后使用它。首先它是由 python 自己处理的。
  • 巴巴克,你可能想检查你已经接受的答案,尤其是如果你要依赖它来完成课堂作业(不那里有判断,但盲目地使用代码不会对你有任何好处)。虽然回答者的概念是正确的,但代码目前是完全错误的。

标签: python-3.x


【解决方案1】:

说明
是的,HSK 是对的。在第二个循环中:

while b:
    a = b
    b = a % b
print(a)

首先将a 更改为b,然后您所做的是b = b% b。但在这里:

a, b = b, a % b

它作为单行执行,所以a 仍然是a


解决方案
所以只需添加第三个变量:

a = 1071
b = 462
while b:
    c = a
    a = b
    b = c % b
print(c)

Python 与其他编程语言的区别在于它是解释型的,而不是编译型的。这意味着它是逐行执行的。

【讨论】:

  • a = 2b = 3 给出错误答案。答案应该是1,程序输出2
【解决方案2】:

第二个不起作用,因为对于b 的计算,您需要使用 a,而不是之前在行上生成的新a (这实际上设置为b,所以你会得到b % b,通常为零)。相当于第一个循环是:

while b:
    oldA = a
    a = b
    b = oldA % b

print(a)

Python 中的元组赋值可以认为是一个原子操作,其中右侧的所有值都被加载,然后分配给左侧的所有变量。

【讨论】:

    【解决方案3】:
    def divisor(n):
      if n ==1 or n ==2 or n ==3:
        return []
      else:
        result=[]
        aux=2
        while aux <= n:
          if n % aux == 0:
             result.append(aux) 
          aux=aux+1
        return result
    
    def func (m,n):
      div1=divisor(m)
      div2=divisor(n)
      result =[]
      for x in div1:
        for y in div2:
          if x == y:
            result.append(x)
      return result
    print(func (x,y))
    

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    • @Zoe 你能解释回滚的原因吗?这个版本有bug。它既不返回GCD,也不返回任何输入除数,例如:x=2y=4
    猜你喜欢
    • 2020-04-17
    • 1970-01-01
    • 2020-12-07
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多