Java 最大公约数

Java 最大公约数,java,Java,我试图找到两个整数的最大公约数。但我不明白我的代码有什么问题: public class Main { public static void main(String[] args) { Scanner s = new Scanner(System.in); int a = s.nextInt(); int b = s.nextInt(); while (a != 0 | b != 0) { if

我试图找到两个整数的最大公约数。但我不明白我的代码有什么问题:

public class Main {

    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);

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

        while (a != 0 | b != 0) {
            if (a >= b) {
                a = a % b;
            } else {
                b = b % a;
            }
        }

        if (a == 0) {
            System.out.println(b);
        } else {
            System.out.println(a);
        }
    }
}
换衣服

a != 0 | b != 0

因为即使a或b等于0,您的版本也会工作。 但当其中一个等于0时,您需要退出循环。 &&-优于&因为在您的情况下,您不需要检查
右运算符如果左等于0

如果我们理解核心逻辑,则更容易计算GCD。在实施该计划之前,尽量了解我们需要做什么,以及我们将如何做

我们试图找到的是将ab分开的最大的

因此,问题出现了,我们将如何去做。我们像您一样进行循环,但对于这种情况,让我们首先假设a大于b

第一步是在计算尚未完成时启动循环。我们的情况是,当两个数字中的任何一个变为零时,我们必须停止。

现在我们必须写下计算结果。我们假设a大于b,或者两者相等

我们继续将a的剩余部分除以b分配给a

这使得解决方案只正确了一半,我们必须处理另一种情况,即b大于a。发生这种情况的原因是在一组迭代之后,a将小于b,这将导致a被设置为0

因此,让我们对另一种情况使用相同的解决方案,当a小于b

这就是你想要实现的。非零值将是解决方案

让我们不要到此为止,看看为什么您当前的版本不起作用。在你的情况下你有过这个

你的情况是:

a != 0 | b != 0
在这里,您使用的是位运算符或,介于两个布尔值之间,其结果如下。假设ab中的任何一个为零

案例1:

a != 0 => true
b != 0 => false

true | false => true
案例2:

a != 0 => false
b != 0 => true

false | true => true
因此,正如您在上述案例中所看到的,它将继续循环,直到两者都变为零,因此您将始终被报告为GCD为零


希望这有帮助。

您可能需要实现Eudidean算法(实际上是关于数学的),但下面是一个alg如何工作的示例

private static int GCD(int a, int b)
    {

        int remainder = a % b;
        while (remainder!= 0)
        {

            a = b;
            b = remainder;
            remainder = a % b;
        }

        return b;
    }

它不应该是
while(a!=0&&b!=0)
而不是
while(a!=0&b!=0)
?while(a>0&&b>0),所以如果a或b等于0,循环将中断。我认为它应该是或实际上是。如果它们都是零,他是如何得到正在计算的值的?如果它是
,而
b
0
,那么
a=a%b将是一个问题。
a != 0 | b != 0
a != 0 => true
b != 0 => false

true | false => true
a != 0 => false
b != 0 => true

false | true => true
private static int GCD(int a, int b)
    {

        int remainder = a % b;
        while (remainder!= 0)
        {

            a = b;
            b = remainder;
            remainder = a % b;
        }

        return b;
    }