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。在实施该计划之前,尽量了解我们需要做什么,以及我们将如何做 我们试图找到的是将a和b分开的最大的数 因此,问题出现了,我们将如何去做。我们像您一样进行循环,但对于这种情况,让我们首先假设a大于b 第一步是在计算尚未完成时启动循环。我们的情况是,当两个数字中的任何一个变为零时,我们必须停止。 现在我们必须写下计算结果。我们假设a大于b,或者两者相等 我们继续将a的剩余部分除以b分配给a 这使得解决方案只正确了一半,我们必须处理另一种情况,即b大于a。发生这种情况的原因是在一组迭代之后,a将小于b,这将导致a被设置为0 因此,让我们对另一种情况使用相同的解决方案,当a小于b时 这就是你想要实现的。非零值将是解决方案 让我们不要到此为止,看看为什么您当前的版本不起作用。在你的情况下你有过这个 你的情况是:
a != 0 | b != 0
在这里,您使用的是位运算符或,介于两个布尔值之间,其结果如下。假设a和b中的任何一个为零
案例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;
}