我需要创建一个程序,使用以下公式找出两个用户输入数字的最大公因子:
gcd(x,y)= gcd(x-y,y)如果x> = y且gcd(x,y)= gcd(x,y-x),如果x <年。
例如: gcd(72,54)= gcd(72-54,54)= gcd(18,54)因为72> 54,我们用72 - 54 = 18替换72,并用新值继续循环
迭代2:gcd(18,54)= gcd(18,54 - 18)= gcd(18,36) 从18&lt; 54,我们用54 - 18 = 36代替54,并用新值继续循环
迭代3:gcd(18,36)= gcd(18,36 - 18)= gcd(18,18) 从18&lt; 36,我们用36 - 18 = 18替换36并用新值继续循环
迭代4:gcd(18,18)= gcd(18 - 18,18)= gcd(0,18)= 18 由于18> = 18,我们用18 - 18 = 0替换前18 由于其中一个值为0,因此我们不会继续循环 非零值18是gcd。
以下是我到目前为止的代码:
我收到错误“非法开始表达。”
答案 0 :(得分:1)
首先在你的逻辑中:
do {
int gcd1 = (num1-num2);
System.out.println(gcd1 + "," + num2);
}
while (num1 != 0 && num2 != 0);
return
}
您只是在不更新num1和num2的情况下打印出gcd1和num2。
还要考虑如何使用递归来解决这个问题。
如果你坚持使用循环,这里是while循环逻辑:
public static int greatestCommon(int a, int b)
{
while (a != 0 && b != 0)
{
if (a >= b)
{
a = a - b;
}
else
b = b - a;
}
if (a == 0) return b;
else return a;
}
请注意,您不需要使用do-while循环,因为在某些情况下您不需要减法(如果其中一个或两个都为0)。
答案 1 :(得分:1)
使用
Math.Max(num1, num2) - Math.Min(num1,num2)
而不是num1-num2
答案 2 :(得分:0)
你已经在第一句话中说明了答案(算法):
gcd(x, y) = gcd(x – y, y) if x >= y and gcd(x, y) = gcd(x,y-x) if x < y.
那么如何将其转换为代码呢?等式的左边是你的方法原型,右边是你的方法体:
public static int gcd(x, y) // doesn't HAVE to be public or static
{
gcd(x – y, y) if x >= y and gcd(x, y) = gcd(x,y-x) if x < y
}
但是正文中的代码无法编译,因此您需要重写正文。请注意"and gcd(x, y) = ..."
是方法原型的重复,因此被删除:
public static int gcd(x, y)
{
if (x >= y)
{
return ... // you fill this in
}
else if (x < y)
{
return ... // you fill this in
}
}
请注意,最后的“else-if”检查确实没有必要,但是老师可能希望在那里看到它。
修改强>
由于这可能是递归的课堂练习,请考虑从javax.swing.table.DefaultTableModel
获取此工作示例:
private static int gcd(int i, int j)
{
return (j == 0) ? i : gcd(j, i%j);
}
SIDENOTE:请勿将其转入,因为它显然不是来自给您的算法,而且您的老师可能会将其标记错误。
由于您可能没有学过三元运算符语法,我将其重写为:
private static int gcd(int i, int j)
{
if (j == 0)
return i;
else
return gcd(j, i%j);
}
这是一个递归的例子,在某些情况下我们可以返回一个已知值,但是该方法必须使用一组不同的参数再次调用自己。
编辑2:
由于需要使用交互式方法代替递归方法,请记住所有递归方法都可以使用迭代重写(即通过循环)。
进一步阅读: