-1

I need to create a program that finds the greatest common factor of two user entered numbers using this formula:

gcd(x, y) = gcd(x – y, y) if x >= y and gcd(x, y) = gcd(x,y-x) if x < y.

For example: gcd(72, 54) = gcd(72 – 54, 54) = gcd(18, 54)Since 72 > 54, we replace 72 with 72 – 54 = 18 and continue the loop with the new values

Iteration 2: gcd(18, 54) = gcd(18, 54 – 18) = gcd(18, 36) Since 18 < 54, we replace 54 with 54 – 18 = 36 and continue the loop with the new values

Iteration 3: gcd(18, 36) = gcd(18, 36 – 18) = gcd(18, 18) Since 18 < 36, we replace 36 with 36 – 18 = 18 and continue the loop with the new values

Iteration 4: gcd(18, 18) = gcd(18 – 18, 18) = gcd(0, 18) = 18 Since 18 >= 18, we replace the first 18 with 18 – 18 = 0 Since one of the values is 0 we do not continue the loop The nonzero value, 18, is the gcd.

Here's of the code I have so far:

enter image description here

I'm getting the error "Illegal start of expression."

4

3 回答 3

2

首先在您的逻辑中:

do {
   int gcd1 = (num1-num2);
   System.out.println(gcd1 + "," + num2);

   }
   while (num1 != 0 && num2 != 0);
   return
}

您只是打印出 gcd1 和 num2 而不更新 num1 和 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)。

于 2013-10-04T14:50:09.980 回答
2

利用

Math.Max(num1, num2) - Math.Min(num1,num2)

代替num1-num2

于 2013-10-04T14:51:04.423 回答
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);
}

旁注:不要上交这个,因为它显然不是来自给你的算法,你的老师可能会标记它是错误的。

由于您可能没有学习过三元运算符语法,因此我将其重写为:

private static int gcd(int i, int j)
{
  if (j == 0)
    return i;
  else
    return gcd(j, i%j);
}

这是递归的一个例子,在某些情况下我们可以返回一个已知值,但否则该方法必须使用一组不同的参数再次调用自己。

编辑2:

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

进一步阅读:

重构:用迭代代替递归

于 2013-10-04T15:19:21.230 回答