寻找最大的公约数(任务被误解,我迫切需要你的帮助)

时间:2013-12-12 09:24:23

标签: python python-3.x

我的作业(作业)如下:

  

编写一个程序,从中输入两个正整数a和b   键盘。还要写一个递归函数来确定gcd   使用Euclid算法的a和b的(最大公约数)。   根据该算法,如果第一个数字可被整除   第二个然后第二个是gcd。如果不是这样的话   第二个数字的gcd和a = b的余数必须是   决心。结果应打印在屏幕外面   功能

这是我的解决方案:

a=int(input("Enter the first number: "))
b=int(input("Enter the second number: "))

def GCDfinder(m,n):
    z=abs(m-n)
    if (m-n)==0:
        return n
    else:
        return GCDfinder(z,min(m,n))

print (GCDfinder(a,b))

这个答案得到了50%。我认为分级的老师的助手不知道她做了什么。她的评论如下:

  

这不是作业中描述的方法。你应该先   检查%b == 0然后返回b。或者返回gcd(b,a%b)同时检查一下   输入是正的并且a> b

1-)我使用的方法是基于欧几里德定理。 http://en.wikipedia.org/wiki/Euclidean_algorithm

2-)绝对没有必要检查> b并且也不需要检查输入是否为正,因为我使用了abs()

TA没有错误地评估任务吗?或者我错了吗?

3 个答案:

答案 0 :(得分:4)

虽然您实施的确实是GCD查找器,但它不是Euclid的算法

这就是你所做的:

if the two numbers are equal
    return either one as the GCD
else
    return the GCD of the absolute difference between them and the smaller number

您的算法通过重复减法找到GCD。虽然这没有错,但它肯定不是Euler的算法(尽管它很接近)。

Euler的算法确实:

if the smaller number perfectly divides the larger
    return the smaller number as the GCD
else
    return the GCD of 
        1. the remainder from dividing the bigger number by the smaller
        2. the smaller number

因为Euclid的算法使用模数运算符,所以它的步数要少得多,而实际上计算的算法与算法相同。因此,它更有效率。

以下是Euclid算法的实现:

def GCDfinder(a,b):
    while b != 0:
        a,b = b, a%b
    return a

>>> GCDfinder(12,20)
4
>>> GCDfinder(17,20)
1
>>> GCDfinder(3,4)
1

答案 1 :(得分:2)

我真的认为你和TA都是对的。但是因为他/她是TA,他更加正确。 ;)

让我解释一下:

你是对的,因为你完全成功地编写了一个确定GCD的程序。 但是,TA是正确的,因为您没有按照分配的步骤进行操作,在这种情况下,分配的步骤是领先的。

比较: 你得到50%的事实意味着虽然你解决了问题(找到GCD),但你没有遵守规则。将它与寻宝者进行比较。要完成此操作,您必须按照指示中的所有步骤操作。然而,你在这里所做的相当于听到有人谈论终点线的位置,然后直接进入终点线,而不是从预期的方式中挑战/谜题中学习任何东西

答案 2 :(得分:1)

这是Euclid算法的递归实现:

def gcd(a, b):
    if b==0:
        return a
    else:
        return gcd(b, a%b)

这是基于http://en.wikipedia.org/wiki/Euclidean_algorithm#Implementations

的伪代码