在用于计算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;
}
}
答案 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) .....