基础Java:找到最重要的共同因素

时间:2013-10-04 14:21:06

标签: java

我需要创建一个程序,使用以下公式找出两个用户输入数字的最大公因子:

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。

以下是我到目前为止的代码:

enter image description here

我收到错误“非法开始表达。”

3 个答案:

答案 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:

由于需要使用交互式方法代替递归方法,请记住所有递归方法都可以使用迭代重写(即通过循环)。

进一步阅读:

Refactoring: Replace Recursion With Iteration