努力理解这段代码如何输出欧几里得算法
Posted
技术标签:
【中文标题】努力理解这段代码如何输出欧几里得算法【英文标题】:Struggling to understand how this code outputs Euclid algorithm 【发布时间】:2015-11-20 17:42:06 【问题描述】:我正在尝试编写欧几里得算法的代码,我在网上找到了一些代码,它可以计算输入的两个数字的最大公约数。这里是
else
return gcd(b, a % b);
但是,我不太明白它是如何让我成为最大公约数的。我了解欧几里得算法在纸上的工作原理,但不是这个。
在我看来,上面的代码应该返回 b 的模 a,所以如果“a”是 1071,“b”是 462,它将返回 147,但是上面的代码返回 21。<code>gcd(b, a % b);
中的第一个 b 如何影响输出?
这是完整的代码:
package algorithms;
import java.util.Scanner;
public class Question3
private static Scanner input=new Scanner(System.in);
public static void main(String[] args)
//simple input statements to get the numbers of the user
System.out.print("Please input the first number to be worked on= ");
double a=input.nextDouble();
System.out.print("Please input the second number to be worked on= ");
double b=input.nextDouble();
//call the method in which the calculations are done
double commondiv=gcd(a,b);
//print out the the common divisor
System.out.print("The Common Divisor of "+ a +" and "+ b + " is "+commondiv);
//System.out.print(b);
public static double gcd(double a, double b)
//an if statement will allow for the program to run even if
//a is greater than b
if (a>b)
//if the input b is equal to zero
//then the input a will be returned as the output
//as the highest common divisor of a single number is itself
if (b == 0)
return a;
//this returns the greatest common divisor of the values entered
else
return gcd(b, a % b);
else if (a<b)
if (a == 0)
return b;
else
return gcd(a, b % a);
return 0;
【问题讨论】:
如果 a 是 1071,b 是 462,它将返回 462 和 147 的 gcd。 【参考方案1】:请参阅以下迭代说明:
在第一次迭代中 a = 1071 和 b = 462
a >b 所以 gcd(b,a % b) 即 gcd(462,147)
再次 a>b 为真,因为 a = 462,b = 147 所以 gcd(147,21)
a>b 为真,因为 a = 147,b = 21 所以 gcd(21,0)
a>b 为真,因为 a = 21 ,b = 0 现在 b == 0 为真 返回 a 即 21
【讨论】:
我想我现在明白了,你的评论让我意识到输出可以被认为是返回 gcd(b)(a%b)。出于某种原因,我把它想成 gcd(b,a%, b) !以上是关于努力理解这段代码如何输出欧几里得算法的主要内容,如果未能解决你的问题,请参考以下文章