修复两个整数的GCD

时间:2013-11-20 21:33:02

标签: java greatest-common-divisor

我是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);
                    }
                }
            }
        }
    }
}

5 个答案:

答案 0 :(得分:4)

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

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

应该是

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

反之亦然。虽然通过简单地使用b < a作为第二个句子(当然还有适当的包围)来处理a == b问题以及else是好的。

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

答案 1 :(得分:1)

你有两个ifs,并且有些不正确的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。

答案 2 :(得分:1)

您的循环条件不正确:

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

应该有以下几点来理解:

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

但是,我会选择Euclid的算法递归方法,有效且简单:

  public static int gcd(int p, int q) {
    if (q == 0) {
      return p;
    }
    return gcd(q, p % q);
  }

答案 3 :(得分: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

答案 4 :(得分:0)

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

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