欧几里得的算法

时间:2016-07-14 12:11:16

标签: java algorithm

在用于计算gcd(x, y)的欧几里得算法的示例中,x总是大于y。这个条件重要吗?如果x小于y会怎样?为什么即使输入的x值小于y,此程序仍会返回正确的结果?

import acm.program.*;
/*
GCD Algorithm - greatest common divisor. "Euclid Algorithm approach"

 */
public class EuclidsAlgorithm extends ConsoleProgram {
    public void run(){
        println("This program is calculating the gratest common divisor (GCD) of two numbers.");
        int x = readInt("Enter 1st number: ");
        int y = readInt("Enter 2nd number: ");
        println("GCD(" + x + ", " + y + ") = " + gcd(x, y) );
    }

    private int gcd(int m, int k){
        int r = m % k;
        while (r != 0){
            m = k;
            k = r;
            r = m % k;
        }
        return k;
    }
}

4 个答案:

答案 0 :(得分:5)

输入的顺序与结果无关。

如果m < k,那么r的初始值只是m;然后m收到k的值,k收到r的值,即m

因此,输入在循环的第一次迭代中被有效地交换,因此m > k

显然,执行第一次迭代以交换输入需要(稍微)更长时间:如果您能够以输入已经处于m > k顺序的方式调用方法,那么您可以节省一些工作

答案 1 :(得分:1)

因为:r = m%k

,两个输入的顺序无关紧要
if(m < k)
r = m
if(m == k)
r = 0
if(m > k)
r =  an integer number between 0 and k

并且r是一个不断缩小和收缩的数字,直到找到可以分割两个数字或0的数字为止。

答案 2 :(得分:0)

它返回正确的结果,因为当您将较小的数字除以更大的数字时,您获得的模数是较小的数字。

因此,例如, 10%14 将为您提供 10 。 因此,在您的逻辑中,如果我们以10和14为例,将 x 传递为 10 ,将 y 传递为 14 ,我们仍然会得到 2 作为正确的答案。 虽然在此代码中,while循环将比我们将 x 作为 14 y 传递为 10

答案 3 :(得分:-1)

实际上没关系 这就是为什么

GCD(x,y)
  if (y == 0 ) return x
return GCD(y,x%y)

假设x = 3,Y = 5

GCD(3,5) = GCD(5,3%5) = GCD(5,3) = GCD(3,2) .....