1

我是Java的初学者。我被要求编写一个程序来查找用户输入的两个数字的 GCD。我试过了,但没有输出,如何解决?

import java.util.Scanner;

public class myclass {

    public static void main(String args[]) {

        Scanner scan = new Scanner(System.in);

        int a = scan.nextInt();
        int b = scan.nextInt();

        if (a < b) {
            for (int c = a; c < 0; c--) {
                if (a % c == 0 && b % c == 0) {
                    System.out.print(c);
                }
            }

            if (b < a) {
                for (int c = b; c < 0; c--) {
                    if (b % c == 0 && a % c == 0) {
                        System.out.print(c);
                    }
                }
            }
        }
    }
}
4

5 回答 5

4

更大的问题是您的循环条件不正确:

for (int c = a; c < 0; c--)

应该

for (int c = a; c > 0; c--)

反之亦然。虽然处理这个b < a问题很好,也可以a == b简单地使用elsefor 第二个子句(当然有适当的括号)。

然后是找到GCD后打印出错误解决方案的问题。为此,请break;在 print 语句之后使用。

于 2013-11-20T21:36:23.647 回答
1

您有两个相互之间的 if,并且 for 循环比较有些不正确。尝试:

 import java.util.Scanner;

  public class myclass {

public static void main(String args[]) {

    Scanner scan = new Scanner(System.in);

    int a = scan.nextInt();
    int b = scan.nextInt();

    if (a < b) {
        for (int c = a; c > 0; c--) {
            if (a % c == 0 && b % c == 0) {
                System.out.print(c);
            }
        }
    }
    if (b < a) {
        for (int c = b; c > 0; c--) {
            if (b % c == 0 && a % c == 0) {
                System.out.print(c);
            }
        }

    }

}
}

不管怎样,GCD 有一个更好、更有效的算法。我不会为你编写代码,但它是通过从较大的数字中减去较小的数字来完成的,尽可能多次,而不会使最终差异为负数。如果最后一个数字非零,则切换数字并继续。当你最终得到两个数字相等时,这就是 GCD。

于 2013-11-20T21:34:39.547 回答
1

您的循环条件不正确:

for (int c = b; c < 0; c--)

应该是以下内容才有意义:

for (int c = b; c > 0; c--)

但是,我会选择欧几里得算法递归方法,有效且更简单:

  public static int gcd(int p, int q) {
    if (q == 0) {
      return p;
    }
    return gcd(q, p % q);
  }
于 2013-11-20T21:41:42.907 回答
0

其他人已经修复了您的代码。如果您想要更短的方法,可以查看以下示例:

public static void main(String[] args) {
    int a = 60;
    int b = 24;

    for(int i = Math.min(a, b); i > 0; i--){
        if(a % i == 0 && b % i == 0){
            System.out.println("GCD: " + i);
            break;
        }
    }
}

输出:

GCD:12

通过使用Math.min(),您不必创建两个循环来查看是否a应该从哪里开始,或者b.

于 2013-11-20T21:37:52.823 回答
0

您的 for 循环永远不会在用户的典型(读取:正)输入上执行。

c通常不会低于0并且循环将在它运行一次之前终止。另请参阅此java 教程

于 2013-11-20T21:37:55.440 回答